有关闭包问题。

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吗??

阅读 2.7k
3 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题