ES6 - 箭头函数this
https://zhuanlan.zhihu.com/p/57204184
一、普通函数里面的this
JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。 1、在方法中,this 表示该方法所属的对象。 2、如果单独使用,this 表示全局对象。 3、在函数中,this 表示全局对象。 4、在事件中,this 表示接收事件的元素。 5、类似 call() 和 apply() 方法可以将 this 引用到任何对象。
来看例子:
//示例1
var name = '小王',age=17;
var obj={
name:'小张',
objAge:this.age,
myFun:function(){
console.log(this.name + "年龄" + this.age);
}
}
运行后:
obj.Age;//17
obj.myFun()//小张年龄 undefined
//示例2
var fav = '盲僧';
function show(){
console.log(this.fav);
}
运行后:
shows()//盲僧
比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;
二、箭头函数里面的this:
定义:
函数执行上下文环境中,箭头函数没有this 并不会绑定一个 this 变量,它的作用域会如同寻常所做的一样一层层地去往上查找,可以在箭头函数外层 打印 this 逐层打印 直到有值。注意只有函数才有作用域
什么是作用域

一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。
但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
作用域有上下级关系,上下级关系的确定就看函数是在哪个作用域下创建的。如上,fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级。
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
变量取值:到创建 这个变量 的函数的作用域中取值
来看例子:
var name = 'window';
var A = {
name: 'A',
sayHello: () => {
console.log(this.name)
}
}
A.sayHello();// 还是以为输出A ? 错啦,其实输出的是window
分析原因:
“该函数所在的作用域指向的对象”,作用域是指函数内部,这里的箭头函数,也就是sayHello,所在的作用域其实是最外层的js环境,因为没有其他函数包裹;然后最外层的js环境指向的对象是window对象,所以这里的this指向的是window对象。
那如何改造成永远绑定A呢:
var name = 'window';
var A = {
name: 'A',
sayHello: function(){
var s = () => console.log(this.name)
return s//返回箭头函数s
}
}
var sayHello = A.sayHello();
sayHello();// 输出A
var B = {
name: 'B';
}
sayHello.call(B); //还是A
sayHello.call(); //还是A
OK,这样就做到了永远指向A对象了,我们再根据“该函数所在的作用域指向的对象”来分析一下:
该函数所在的作用域:箭头函数s 所在的作用域是sayHello,因为sayHello是一个函数。
作用域指向的对象:A.sayHello指向的对象是A。
所以箭头函数s 中this就是指向A啦 ~~
接着来看一下 setTimeout 情况:
const person = {
name: 'tom',
sayHiAsync: function () {
setTimeout(() => {
console.log(`hi, my name is ${this.name}`);
}, 1000);
}
}
person.sayHiAsync(); // hi, my name is tom
setTimeout中的function函数体中的this指向的是上层函数体中的this,即sayHiAsync: function() {}中的this,而这里的this取决于谁调用了它,person调用了sayHiAsync,那么相当于person.name
箭头函数里面的this定义时会继承自外部的this,普通函数中的this并不会向上继续找对象,箭头函数中会往上寻找this,直到找到所代表的this为止。
posted on 2021-11-29 14:52 TrustNature 阅读(226) 评论(0) 收藏 举报
浙公网安备 33010602011771号