Javascript闭包/变量范围问题 - 我知道它有效,但为什么?

时间:2009-11-19 18:40:08

标签: javascript scope closures

我用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();

3 个答案:

答案 0 :(得分:2)

总之,是的。发现。

答案 1 :(得分:2)

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

实际上,创建一个函数是唯一在JavaScript中创建词法范围的方法,这就是为什么你一直看到这样的扭曲:

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

答案 2 :(得分:0)

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

How do JavaScript closures work?

正如斯科特所提到的那样,

有更好的答案。