【问题标题】:How does lexical scope work here when setTimeout is involved?当涉及 setTimeout 时,词法作用域如何在这里工作?
【发布时间】:2020-04-29 19:19:34
【问题描述】:

考虑以下代码:

function foo (){

 var count = 40;
 setTimeout(function bar(){
   console.log(count)
 })
 count = 50;
}

foo();

这可以正确打印50,这很好。但是,如果我只是将count 作为参数传递给函数bar,它会打印undefined。为什么它不从词法范围中取值?

function foo (){

 var count = 40;
 setTimeout(function bar(count){
   console.log(count)
 })
 count = 50;
}

foo(); //Prints undefined

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在第一种情况下,您的函数有一个要计数的 closure,由于 setTimeout 回调在赋值后运行,您会看到值 50。

    在第二种情况下,您的函数接受一个名为 count 的参数。该参数比外部变量“更强”(因为它在函数的本地范围内)并且由于您没有将其作为参数传递给函数调用,因此它的值为undefined

    【讨论】:

    • 啊,明白了!谢谢:)
    【解决方案2】:

    count 在 foo 函数的函数范围内定义为 setTimeOut 一段时间后执行,它来自声明 count 的 foo 函数范围,这就是它给出 undefined 的原因

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 2018-05-18
      • 2012-10-13
      • 2012-08-02
      • 2014-02-15
      • 2018-01-17
      • 2017-11-11
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多