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

Scope and maintainance of variable state in self invoking anonymous function vs anonymous functions

我想了解匿名自调用函数能够保持变量的最后更新状态的方式,但为什么在普通匿名函数的情况下不可能。两个函数都是闭包 在保持以前的变量状态的同时仍然表现不同。 例如:

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 和一个 temp,其 mypublicfunction 函数关闭了那个 a,因此多次调用 mypublicfunction 会导致a 多次更改。