综述:
普通函数的this,指向调用它的对象。
箭头函数的this,指向最近的一个this。(注意,只有全局作用域和函数里面才有this,所以,箭头函数的this,要么指向全局作用域,要么指向某一个函数)
接下来,我们通过几个例子,具体分析。
情况一
var id = 'GLOBAL'; // 定义一个全局作用域的属性
let obj = {
id: 'OBJ',
a: function () {
console.log(this.id);
},
b: () => {
console.log(this.id);
}
};
obj.a(); // 'OBJ'
obj.b(); // 'GLOBAL'
解释一下,普通函数中的this,指向调用它的对象,这个对象就是obj。箭头函数的this,在定义的时候确定,箭头函数外层没有函数,所以this指向全局作用域。
情况二
var id = 'GLOBAL'; // 定义一个全局作用域的属性
let obj = {
id: 'OBJ',
a: function () {
console.log(this.id);
const b = () => {
console.log(this.id);
}
b() // 'OBJ'
},
};
obj.a(); // 'OBJ'
普通函数的this,依旧指向,obj。但是这个时候,箭头函数定义在一个函数内部,所以,箭头函数的this指向包裹它的函数,那么也指向obj。
文末彩蛋
不知道有没有细心的朋友,看到我在定义最外层那个id的时候,用的是var,如果用let,const会有什么不同呢?接下来,我通过几张截图,展示一下区别。
var id = 'GLOBAL'; // 定义一个全局作用域的属性
可以看到,用var定义的变量直接绑定在了全局作用域上。
let id = 'GLOBAL';
可以看到,用let定义的变量,会在作用域链上生成一个脚本作用域的概念。
所以,var与let,const在作用域上还是有明显区别的。