javascript闭包中的新手,并且闭包测试的结果是未预料到的

时间:2013-07-30 02:31:38

标签: javascript closures

javascript关闭中的新手

我按照互联网上的一个例子,尝试改变其中一些

我认为应该给我16,17,18,19

但结果是不正常的

这是我的代码。 我不知道为什么我第一次打电话给bar2(10),警报17,它应该给我18?


function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); 
bar(10);//alert16
bar(10);//alert17
var bar2 =  foo(3);
bar2(10);//alert17
bar2(10);//alert18

3 个答案:

答案 0 :(得分:2)

因为tmp是您从foo返回的函数的本地变量 - 这意味着当您第二次调用foo时,它会重置为3. 3 +( 3 + 1)+ 10 = 17。

答案 1 :(得分:0)

结果17是正确的。

每次调用foo都会生成一个函数,其中包含已结束变量tmp

也许您认为对foo的第二次通话使用与第一次通话中相同的tmp?它没有。这就是为什么你得到17:3 + 10 + 4。

答案 2 :(得分:0)

  1. bar(y)= n = x + y + tmp
  2. bar(10)= 16 = 2 + 10 + 4
  3. bar(10)= 17 = 2 + 10 + 5
  4. bar2(10)= 17 = 3 + 10 + 4
  5. bar2(10)= 18 = 3 + 10 + 5