我用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();
答案 0 :(得分:2)
总之,是的。发现。
答案 1 :(得分:2)
function
特殊表单创建词法范围。在该范围内创建的任何对象都将在创建时以范围的形式看到环境(名称与值的绑定)。
实际上,创建一个函数是唯一在JavaScript中创建词法范围的方法,这就是为什么你一直看到这样的扭曲:
return (function() {
var privateVariable = 'foo';
return {
myProp: privateVariable
};
})();
答案 2 :(得分:0)
testString存在于testClosure的范围内,因此就您的计时器而言,testString是一个全局变量。
How do JavaScript closures work?
正如斯科特所提到的那样,有更好的答案。