1

I want to understand the way anonymous self invoking function is able to maintain the last updated state of variable but why is it not possible in case of normal anonymous functions .Both functions are closures still are behaving differently while maintaining the previous state of variable. ex:

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

Same works fine for non self invoking if invoked as :

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

Please help me understand the same.

4

1 回答 1

0

每次执行外部函数的主体时,这些行:

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

于 2020-03-13T02:14:19.207 回答