首页 > 有关闭包问题。

有关闭包问题。

function outer() {
    var n = 999;
    nAdd = function() { n++; };
    function fun() { return n; }
    return fun;
}

var result1 = outer();
var result2 = outer();
console.log(result1());//999
console.log(result2());//999
nAdd();
console.log(result1());//999
console.log(result2());//1000

不明白,,第三个输出不应该也是1000吗??


你的代码执行应该是产生了两个闭包。
var n = 999;属于函数的作用域。 nAdd函数里面的n始终指向result2产生的闭包。


每次调用 outer() 都会产生一个新的作用域,所以 result1result2 所对应的 n 是不一样的。


刚刚说错了,我懂了,正如上面的同志说的。因为取得那个 n 都是 各自 函数定义域里面的那个 n , 而nAdd()执行的其实是 result2里面的那个 nAdd,因为第一次被第二的给覆盖掉了。所以 nAdd其实加的是 result2里面的那个n,而第一个里面的那个n并没有加。所以 result1个弹出来的还是 999,它作用域里面的n并没有加1;result2里面的才加了1,所以n===1000

【热门文章】
【热门文章】