箭头函数的this始终指向window/全局?能否指向非全局对象?
箭头函数的
this指向规则详解 首先直接给结论:箭头函数的this并不是始终指向window/全局对象,它的指向完全由**定义时所在的外层作用域的this**决定,而不是调用时的上下文。
先分析你的代码困惑
你最初写的funcTest2b: ()=>console.log("test _2b: "+ this),不管是直接调用obj.obj1.obj2.funcTest2b(),还是在obj.obj1.obj3.test3()里面调用,它的this都是window。这是因为这个箭头函数定义在obj2对象的属性里,它的外层没有普通函数(对象的属性赋值不属于函数作用域),所以它会直接继承最顶层的全局作用域的this,也就是浏览器里的window。
箭头函数如何指向非全局对象?
想要让箭头函数的this指向某个非全局对象,核心是把箭头函数定义在一个普通函数内部,这个普通函数的this就是你想要的对象,箭头函数会自动继承这个this。
比如你找到的这个例子:
a = { hello: 'hola', b() { return () => { console.log(this.hello) //or this; } } } a.b()() // print hola
这里b是普通函数,当你调用a.b()时,b的this指向a;而返回的箭头函数定义在b内部,所以它的this就继承了b的this,也就是a,所以最终能打印出hola。
再看你修改后的funcTest2b:
funcTest2b: function(){ let testInside=()=>console.log("test _2b: "+ this) testInside() }
当你调用obj.obj1.obj2.funcTest2b()时,外层的普通函数funcTest2b的this指向obj2,里面的箭头函数testInside定义在这个普通函数里,所以它的this就继承了funcTest2b的this,也就是obj2,这样就实现了让箭头函数的this指向非全局对象。
关键总结
- 箭头函数没有自己的
this,它的this是定义时外层最近的普通函数的this; - 如果箭头函数外层没有普通函数,才会指向全局对象(浏览器是window,Node.js是global);
- 箭头函数的
this一旦定义就固定了,无法通过call/apply/bind修改,想要改变它的指向,本质是改变它外层普通函数的this指向。
内容的提问来源于stack exchange,提问作者Angelotti
相关产品推荐
相关产品推荐

