箭头函数中的this是在定义函数的时候绑定,而不是在执行函数的时候绑定。
箭头函数中的this是指向外部作用域中的this:
// 普通函数中的this
const obj = {
name: 'John',
greet: function() {
console.log(`Hello, my name is ${this.name}!`);
const arrowFunction = () => console.log(`Arrow function this.name: ${this.name}`);
arrowFunction();
}
};
obj.greet();
// 输出:
// Hello, my name is John!
// Arrow function this.name: John
在JavaScript中,箭头函数没有自己的this,它会捕获其在定义时所处的上下文中的this值。这意味着箭头函数的this与任何包含它的普通函数的this一致。
在上面的例子中,greet函数是在对象obj的上下文中定义的,因此它的this指向obj。箭头函数arrowFunction捕获了这个this值,所以它也指向obj,可以访问obj的name属性。
var m = () => {
console.log(this);
}; //定义了一个箭头函数为m
var obj = {
a: m,
b: function() {
m();
},
c: function() {
var m2 = () => {
console.log(this);
}; //每个对象都会新建这个箭头函数
m2();
}
};
obj.a(); //打印结果:window
obj.b(); //打印结果:window
obj.c(); //打印结果:obj
var obj2 = {};
obj2.c = obj.c;
obj2.c(); //打印结果:obj2
下面分析四次打印:
1、箭头函数定义时所在作用域为全局域,因此箭头函数内的this就是全局域的this,也就是window。且箭头函数不受call的影响,即语法糖使其还原为obj.a.call(obj)也是无效的,this不会变。因此打印结果为window。
2、虽然是在b函数中调用的,但是m函数并不在这里被定义。后续分析基本同1,打印结果为window
3、c函数中重新定义出一个箭头函数m2,而函数m2所在作用域为c函数作用域,所以c函数内的this是什么,箭头函数内的this就是什么。显然此时c函数内的this是obj,因此最终打印结果为obj
4、同3,此时函数c内的this是obj2,因此打印结果为obj2
ES6中定义的时候绑定this的具体含义,应该继承的是父执行上下文里面的this,切忌是父执行上下文!!!
本文深入探讨了JavaScript中箭头函数的this绑定规则。解释了箭头函数如何捕获其定义时所在上下文的this值,以及这种绑定方式如何区别于普通函数。通过实例展示了箭头函数在不同上下文中this的指向。
581

被折叠的 条评论
为什么被折叠?



