【问题标题】:Javascript closure / variable scope question - I know it works, but why?Javascript 闭包/变量范围问题 - 我知道它有效,但为什么呢?
【发布时间】:2010-12-18 10:42:22
【问题描述】:

我已经使用 JS 开发了一段时间,虽然我知道下面的代码可以工作,但我真的不明白为什么它可以工作。

在我看来,我已经在 testClosure 函数中定义了 testString,并且我希望当 testClosure 函数完成时该变量会“消失”,因为它是局部变量。

但是,当我使用计时器调用内部函数时,它仍然知道 testString 变量。为什么?当 testClosure 完成执行时,该变量不是在五秒钟前消失了吗?内部函数是否引用了 testClosure 中的所有变量,并且在所有内部函数完成之前它们保持有效?

function testClosure() {
  var testString = 'hai';

  // after 5 seconds, call function below
  window.setTimeout(function() {

    // check if function knows about testString       
    alert(testString);

  }, 5000);         
}

testClosure();

【问题讨论】:

  • 好问题...我想这取决于setTimeout 是否本质上是异步的,以及setTimeout 是否具有某种特殊属性,可以在启动时保留所需的信息超时部分,然后在执行时使用它...

标签: javascript scope closures


【解决方案1】:

function 特殊形式创建词法范围。在该范围内创建的任何对象都将在其创建时按词法方式在范围内看到环境(名称与值的绑定)。

确实,创建函数是唯一在 JavaScript 中创建词法作用域的方法,这就是为什么你总是会看到这样的扭曲:

return (function() {
    var privateVariable = 'foo';
    return {
        myProp: privateVariable
    };
})();

【讨论】:

【解决方案2】:

testString 存在于 testClosure 的范围内,因此 testString 就你的计时器而言是一个全局变量。

How do JavaScript closures work?

有更好的答案,正如 scott 提到的那样。

【讨论】:

    【解决方案3】:

    总之,是的。看准了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2011-04-13
      • 2017-07-03
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多