1

试图弄清楚为什么自调用函数保留了私有值,而其他类型则没有。

是否增加价值

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
}();
console.log(a());
console.log(a());
console.log(a());

输出:10,11,12

虽然此代码不会增加值

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};
console.log(a()());
console.log(a()());
console.log(a()());

输出:10,10,10

4

2 回答 2

3

console.log在您的第一个示例中, a 是一个在您的 s中重复调用的闭包实例:

console.log(a());  // <-- a is a closure, invoked once
console.log(a());  // <-- the same closure, invoked the second time
console.log(a());  // <-- the same closure, invoked a third time

console.log但是,在您的第二个示例中, a 是在您的 s中重复调用的外部函数:

console.log(a()());  // <-- a is the outer, returning a new closure, invoked once
console.log(a()());  // <-- a is the outer, returning a new closure, invoked once
console.log(a()());  // <-- a is the outer, returning a new closure, invoked once

因此,您在第二个示例中所做的是每次重新创建一个新的闭包,而不是重新调用与第一个示例相同的闭包实例

于 2016-04-27T19:59:08.270 回答
2

外部函数在第一种情况下只被调用一次,但在第二种情况下,你调用它三次,每次你将闭包的个体初始化myval回 10;所以最后你有三个单独的副本,myval它们的值都为 11,从被递增一次。

您的第一个示例更等同于:

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};

var b = a();

console.log(b());
console.log(b());
console.log(b());

而你的第二个是这样的:

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};

var b = a();
var c = a();
var d = a();

console.log(b());
console.log(c());
console.log(d());

a()每次调用都会创建一个新的内部函数,因此在第一种情况下,在您调用a一次的情况下,您有一个具有单个myval作用域的内部函数,但在第二种情况下,您创建了三个独立的内部函数,每个内部函数都有自己myval的作用域.

于 2016-04-27T19:59:23.090 回答