javascript - 为什么这个闭包范围的变量会失去它的值(value)?

标签 javascript closures

我在这里看到了这个 Javascript 测验:http://www.netfxharmonics.com/2008/01/NetFX-Harmonics-JavaScript-Quiz

我无法弄清楚这个问题:

(function(){
    var a = 1;
    var b = 2;

    (function( ) { a = b; var b; })( );

    console.log('a:'+ a);  // => "a:undefined"
    console.log('b:'+ b);  // => "b:2"
})()

但是,如果您从内部函数中删除 var b; 声明,那么 a == 2 就会如您所料。

为什么会这样?

(你可以在这里玩:http://jsfiddle.net/gnhMZ/)

最佳答案

它的发生是因为这个函数:

(function( ) { a = b; var b; })( );

...将 undefined 赋值给 avar takes effect as of the beginning of the scope in which it's written它在分步代码中的位置。当你声明一个变量时,它的初始值为 undefined。所以上面写得更明确,但具有完全相同的功能,看起来像这样:

(function( ) {
    var b = undefined;
    a = b;
})( );

具体来说,当执行进入一个执行上下文时,会发生这些事情:

  1. 为执行上下文创建一个幕后变量对象,并将其放在作用域链的顶部(变量对象链用于解析不合格的引用资料)。
  2. 为在上下文中声明的每个 var 都在该变量对象上创建属性,而不管 var 语句在哪里。每个变量的初始值为 undefined。此时不处理初始值设定项。
  3. 在上下文中为每个声明的函数(使用函数声明,而不是函数表达式)在变量对象上创建属性,无论函数声明在哪里。
  4. 处理函数声明并将结果分配给这些函数的属性。
  5. 从上下文中的第一行分步代码继续执行。当遇到带有初始值设定项的 var 语句时,它会作为简单的赋值语句处理。

顺便说一下,变量对象 也是让闭包起作用的东西。 More here ,但基本上,当一个函数被创建时,它会获得对作用域链中所有变量对象的持久引用。这就是它用来查找它关闭的变量的方法。这很重要,因为闭包不仅对它实际使用的变量有持久引用,而且对定义它的范围内的所有变量都有持久引用,无论它是否使用它们,这都会对这些变量的生命周期产生影响.

关于javascript - 为什么这个闭包范围的变量会失去它的值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5740140/

相关文章:

javascript - 如何在剑道网格中自动启用或禁用滚动条?

javascript - 在 Javascript 中展平和合并对象数组

go - 为什么闭包中的变量没有被遗忘?

swift - 在快速关闭中使用 `[weak self]` 是正确的方法吗?

Javascript: "object properties"实例的空构造函数名称

javascript - 内部有 2 个 div 的 Flex 盒子,其中一个内部有 Canvas

javascript - 如何从 Laravel Blade 访问 JWT?

functional-programming - mapcar 的多个参数

javascript - 多个表单的多个 onsubmit 处理程序

使用 eval 的 javascript 调试功能