javascript - JavaScript中箭头函数中的“this”是什么
问题描述
我对箭头函数中的“this”指向什么有疑问:
// run this file in nodejs by: node test_this.js
const obj = {
scope:this,
func1:()=>{return this},
func2:function(){
const fn = ()=>this;
return fn();
}
}
console.log("0",obj.scope); // module.exports
console.log("1",obj.func1()); // module.exports
console.log("2",obj.func2()); //obj
const newFunc2 = obj.func2;
console.log("newFunc2",newFunc2()); //global
据我所知,箭头函数没有自己的“this”。一旦声明了箭头函数,作用域就决定了“this”,它永远不会改变。但是为什么console.log("2",obj.func2());
输出obj
? 为什么要console.log("newFunc2",newFunc2());
打印不同的结果global
?
解决方案
this
您的obj
声明的词法值为module.exports
. 那是声明变量this
时的值。obj
所以,这解释了为什么
obj.scope
是module.exports
因为这是在this
你的对象被声明并用你的代码初始化时的值scope:this,
正如您似乎已经知道的那样,使用 as in 对象调用箭头函数声明时
obj.func1()
不会执行obj
asthis
。相反,它使用this
(在声明时是什么)的词法版本。如图所示,的obj.scope
词法值为。所以,结果符合预期(因为被定义为箭头函数。this
module.exports
console.log("1",obj.func1())
module.exports
func1
然后, with
obj.func2()
, that 被声明为一个普通函数,所以this
inside of的值func2
,当调用 as 时obj.func2()
将是obj
。这就是方法函数调用obj.func2()
在 Javascript 中的工作方式(只要函数是普通函数定义或方法定义,而不是箭头函数)。
最后,当你这样做时:
const newFunc2 = obj.func2;
您将获得对 JUSTfunc2
方法的引用,这一切都是单独的。您只隔离了该方法,它与该对象完全没有关联。所以,当你这样称呼它时:
console.log("newFunc2",newFunc2());
引用的对象obj
完全消失了,该this
值将被设置为与任何普通函数调用相同。如果您正在运行严格模式,则该值this
将设置为,如果不运行严格模式,则该值将设置为该值。undefined
global
有关所有这些工作原理的评论或未来的参考,请参阅:
推荐阅读
- python - 使用通配符查找列表中元素的索引
- windows - PowerShell 将文件类型向上移动一个目录
- java - Kotlin 术语“可变”是错误的吗?
- ms-access - 带有日期参数的 MS Access 交叉表查询无法正常工作
- styled-components - 样式组件扩展样式与共享样式不起作用
- c# - 警告 MSB3245:无法解析此引用。找不到程序集“系统”
- python - 如何避免无法在 Python(硒)中使用“if”语句定位元素?
- python - 以图形形式表示 python 字典
- angular - 为单元测试提供模拟的角度模块库,Angular11
- c - macOS:使用 CGEventTap 覆盖修饰键