我想了解匿名自调用函数如何维护变量的最后更新状态,但为什么在正常匿名函数的情况下不可能。这两个函数都是闭包在保持变量的先前状态的同时仍然表现不同。例如:
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
函数关闭该a
的temp
,因此多次调用mypublicfunction
会导致该a
更改多次。