【问题标题】:Scope and maintainance of variable state in self invoking anonymous function vs anonymous functions自调用匿名函数与匿名函数中变量状态的范围和维护
【发布时间】:2020-03-13 02:08:11
【问题描述】:

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

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

请帮我理解一下。

【问题讨论】:

  • selfInvokingfunc 尽管有变量名,但它不是函数。它只是保存 IIFE 返回的对象 - 真的很像第三个 sn-p 中的 temp 变量。
  • 那是因为你再次执行nonSelfInvokingAnonymousFunction,当它是 2 两次。请注意,您不必调用您的 selfInvokingfunc,它实际上返回一个 Object,该 Object 具有返回另一个函数的函数属性。

标签: javascript scope closures self-invoking-function


【解决方案1】:

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

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 多次更改。

【讨论】:

  • 感谢您的详细解释,我理解了这个概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2018-01-27
  • 2015-09-20
  • 2010-10-13
相关资源
最近更新 更多