自调用匿名函数与匿名函数中变量状态的范围和维护



我想了解匿名自调用函数如何维护变量的最后更新状态,但为什么在正常匿名函数的情况下不可能。这两个函数都是闭包在保持变量的先前状态的同时仍然表现不同。例如:

var selfInvokingfunc= (function () {
var a=2;
var myprivatefunction = function () {
a=a+2;
console.log(a);
}
return {
mypublicfunction : function () {
myprivatefunction();
}
}
})();
selfInvokingfunc.mypublicfunction() ;//a is 4
selfInvokingfunc.mypublicfunction();  // a is 6
var nonSelfInvokingAnonymousFunction = function () {
var a=2;
var myprivatefunction = function () {
a=a+2;
console.log(a);
}
return {
mypublicfunction : function () {
myprivatefunction();
}
}
};
nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2

同样适用于非自调用,如果调用为:

var temp=nonSelfInvokingAnonymousFunction();
temp.mypublicfunction() ; // a is 4
temp.mypublicfunction(); // a is 6

请帮我理解同样的道理。

每次执行外部函数的主体和行:

var a=2;
var myprivatefunction = function () {
// ...

则在内存中为这些变量创建一个新的绑定。

对于自调用函数,由于它被立即执行,一次,因此a变量存在一个绑定,mypublicfunction属性可以通过闭包看到该绑定。

相反,对于nonSelfInvokingAnonymousFunction,每次调用它时,都会为a:创建一个单独的绑定

nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
// ^^^ creates an a           ^^^^
nonSelfInvokingAnonymousFunction().mypublicfunction(); //a is 2
// ^^^ creates a SEPARATE a   ^^^^

a变量有两个单独的绑定时,对关闭其中一个的函数调用mypublicfunction将不会对另一个绑定产生影响。

在您的上一个代码中,当您执行时

var temp = nonSelfInvokingAnonymousFunction();
//         ^^^ creates an a           ^^^^
temp.mypublicfunction() ; // a is 4
temp.mypublicfunction(); // a is 6

您创建了一个a和一个其mypublicfunction函数关闭该atemp,因此多次调用mypublicfunction会导致该a更改多次。

最新更新