试图弄清楚为什么自调用函数保留了私有值,而其他类型的则没有。
确实增加了价值
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
在你的第一个示例中,a 是一个闭包实例,在你的console.log
中被重复调用:
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
但是,在第二个示例中,a 是在 console.log
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
因此,您在第二个示例中所做的是每次都重新创建一个新的闭包,而不是重新调用与第一个示例中相同的闭包实例。
在第一种情况下,外部函数只被调用一次,但在第二种情况下,你调用它三次,每次你初始化闭包的单个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
。