编程语言
首页 > 编程语言> > JavaScript闭包/变量范围问题-我知道它可以工作,但是为什么呢?

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