箭头函数与常规函数的this指向问题

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述

No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】
6Shader 编程 【图文示例 100+】
7Geoserver 【配置教程 100+】
8卫星应用开发教程 【配置+应用教程 100+】
9GIS数字孪生与大模型 【应用实战 100+】
10报表与数字大屏 【Echarts 实战示例】 - 【D3 综合教程】 - 【其他大屏】


函数中this的指向问题特别容易让人迷糊,这里用示例来指点迷津,走出迷茫。

常规函数下的this指向

1. 纯粹的函数调用

function test(name) { 
    console.log(name) 
    console.log(this) 
} 
test('zjcopy') ; 
test.call('zjcopy', 'cuclife-2') ; 
test.call(false, 'cuclife-3') ; 
test.call(null, 'cuclife-4') ; 
test.call(undefined, 'cuclife-5')  

在这里插入图片描述

说明:
在函数没有调用的时候,this的值是无法确定。 普通的函数调用,this指向的是window窗口。call方法接收的第一个参数就是this,当第一个参数指定为null或者undefined时候,this指向window。

2. 对象中的函数调用

const obj = { 
    name: 'zjcopy.com', 
    greet: function() { 
        console.log(this.name) 
    } 
} 
obj.greet()  //第一种调用方法 
obj.greet.call(obj) //第二种调用方法等同于第一种 
obj.greet.call({name: 'cuclife.com'}) //将this指定为一个对象 

在这里插入图片描述

不同于纯粹的函数,调用的主体是window。这里面指定了用对象来调用自身,所以this指向了name:“zjcopy.com”. 使用call指向name的时候,name值做了更改,所以显示结果为cuclife.com .

3. 构造函数中this

function Test() {     
this.name = 'zjcopy.com'    
 this.age=function() {         console.log(this.name)     }
  } 
 let pp = new Test() 
 console.log(typeof pp) 
  console.log(pp)  
  console.log(pp.age) 
  console.log(pp.age()) 
  console.log(pp.age.call({name : 'cuclife.com'}))
   console.log(pp.name)   

在这里插入图片描述

说明:
构造函数里的this稍微有点特殊,每个构造函数在new之后都会返回一个对象,这个对象就是this

4. window.setTimeout()和window.setInterval()中函数的调用

window.setTimeout()和window.setInterval()的函数中的this有些特殊,里面的this默认是window对象

简单总结一下:函数完整的调用方法是使用call方法,包括test.call(context, name)和obj.greet.call(context,name),这里的context就是函数调用时的上下文,也就是this,只不过这个this是可以通过call方法来修改的;构造函数稍微特殊一点,它的this直接指向new之后返回的对象;window.setTimeout()和window.setInterval()默认的是this是window对象。

箭头函数下的this指向

箭头函数会默认帮我们绑定外层this的值,所以在箭头函数中this的值和外层的this是一样的。

默认绑定外层this, 不能用call方法修改里面的this

const obj = { 
    a: function() { console.log(this) }  , 
                b: () => { 
                     console.log(this) 
                   }   
} 
obj.a(); 
obj.b() 
obj.b.call('zjcopy') 

在这里插入图片描述

在使用箭头函数的例子里,因为箭头函数默认不会使用自己的this,而是会和外层的this保持一致,最外层的this就是window对象。为了减少this的复杂性,箭头函数无法用call方法来指定this。

综合案例

let obj = { 
    name: ' zjcopy.com', 
    age: 3, 
    say1() { 
        setTimeout(function() { 
            console.log("第一个"); 
            console.log( this.name); 
        }, 500) 
    }, 
     say2() { 
        let self = this; 
        setTimeout(function() { 
            console.log("第二个" + self.name); 
        }, 500) 
    }, 
    say3() { 
        setTimeout(() => { 
            console.log("第三个" + this.name); 
        }, 500) 
    } 
} 
obj.say1(); 
obj.say2(); 
obj.say3(); 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值