【问题标题】:lexical this and closures词法 this 和闭包
【发布时间】:2018-06-27 18:56:52
【问题描述】:

我试图了解箭头函数如何传递给setTimeout,从先前的执行上下文中记住this 的值。我知道this 值是在执行箭头函数时使用词法范围规则查找的。这是否意味着箭头函数关闭了变量和 this 关键字?

var obj = {
  name: 'TestName',
  func: function() {
    console.log(this)
    setTimeout(() => console.log(this), 1000)
  }
}

obj.func() //{name: "TestName", func: ƒ}

【问题讨论】:

  • 在普通函数中,this使用词法范围规则查找的。箭头函数改变了这一点并将this保存在闭包中。
  • 感谢 Barmar,我更正了关于查找的声明

标签: javascript closures this


【解决方案1】:

实际上,使用粗箭头符号的全部意义在于继承父作用域。箭头函数的主要应用是下拉父作用域。 当我们调用 setTimeout 时,链发生如下:

  1. 调用进入调用栈
  2. 它被转移到Web-Browser api空间,等待到间隔时间。
  3. 现在间隔时间完成后,它将由 Event-Loop 处理,并将其传输到 JS-queue
  4. 命令执行将等到队列中的其他项目执行完毕,然后它会再次将执行流程转移到调用堆栈,只要它是空的。
  5. 现在setTimeout里面的命令会被执行。

    JS execution flow

【讨论】:

    【解决方案2】:

    这是否意味着箭头函数关闭了this 关键字?

    是的,就是这样。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2011-01-19
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多