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
    };