JavaScript闭包/变量范围问题-我知道它可以工作,但是为什么呢?
作者:互联网
我已经使用JS进行开发了一段时间,虽然我知道下面的代码可以工作,但我并不真正理解为什么它可以工作.
我的看法是,我已经在testClosure函数中定义了testString,并且我期望在testClosure函数完成后该变量会“消失”,因为它是局部变量.
但是,当我使用计时器调用内部函数时,它仍然知道testString变量.为什么?当testClosure完成执行时,该变量不是在5秒钟前消失了吗?内部函数是否引用了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();
解决方法:
函数特殊形式创建词法范围.在该范围内创建的任何对象在创建时都会在范围内按词法查看环境(名称与值的绑定).
实际上,创建函数是在JavaScript中创建词法范围的唯一方法,这就是为什么您总是会看到这样的扭曲的原因:
return (function() {
var privateVariable = 'foo';
return {
myProp: privateVariable
};
})();
标签:scope,closures,javascript 来源: https://codeday.me/bug/20191107/2002314.html