Javascript 字体:胖箭头&;这个范围关系
我在按密码练习 代码参考:Javascript 字体:胖箭头&;这个范围关系,javascript,typescript,ecmascript-6,this,Javascript,Typescript,Ecmascript 6,This,我在按密码练习 代码参考: 有人能解释一下为什么我的输出是未定义的,尽管我使用的是胖箭头函数undefined显示为输出,因为这个指的是setTimeout()函数中的作用域,name不可用,因此,undefined 我通常都是根据自己的想法来做这件事的 ayLater : function(){ let instance = this; setTimeout(function(){ console.log("sayLater :> "+instance.name);
有人能解释一下为什么我的输出是未定义的,尽管我使用的是胖箭头函数
undefined
显示为输出,因为这个
指的是setTimeout()
函数中的作用域,name
不可用,因此,undefined
我通常都是根据自己的想法来做这件事的
ayLater : function(){ let instance = this;
setTimeout(function(){
console.log("sayLater :> "+instance.name);
},3000)
},
希望答案是:)这些箭头函数的
此
值是创建函数的上下文中的此
值。这不是你正在构建的对象;这就是对象初始值设定项代码所在的位置
换句话说,内部
let obj = {
// whatever
};
此
的值与初始化之前或之后的值相同。该语言不提供引用初始值设定项块中“正在构造”对象的方法。没有此引用箭头函数中的对象
箭头函数表达式的语法比函数表达式短,并且没有自己的this[…]
这将始终指向您从中调用的对象,即浏览器中的窗口
胖箭头捕获周围的此
值。对于位于文件顶层的对象文字中的表达式,其周围的此
值为窗口
(非严格模式)或未定义
(严格模式)
因此,您看到的行为是:
sayLater
:未定义
,因为内部函数不使用此
捕获机制(因此此
将“丢失”并返回到窗口
/未定义
)
sayNow
:Cj
因为正常的this
语义(this
是方法调用中
左边的内容)
sayLaterFA
-与sayNow
相同,只是内部函数捕获了外部函数的“正确”此
sayNowFA
-名称不准确,因为它与sayNow
sayLaterPureFatArrow
/sayLaterPureFatArrow
-两个窗口都被捕获为this
这是不准确的;问题不在于setTimeout()
的行为,而在于如何创建箭头函数。此外,如果this
未定义,则this.name
将抛出当箭头函数不在另一个函数作用域内时,此
仅指全局作用域。是的,你们都是正确的。我这边有一个小小的误会。另外,我已经将我的答案更新为rectifyyeah@aseempadhyay,如果我们按照您的方式进行,它肯定会打印名称。。As实例将保存变量的值。“这将始终引用您从中调用的对象”这到底意味着什么?在一个arrow函数中,这个
像任何其他变量一样在词汇上进行解析;函数已被调用,但setTimeout仅被初始化。在setTimeout执行console.log时,此函数的值将在该函数范围内未定义。我对吗@LucaYour对,@CJ
let obj = {
// whatever
};