自调用匿名函数与匿名函数中变量状态的范围和维护
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
多次更改。
我想了解匿名自调用函数能够保持变量的最后更新状态的方式,但为什么在普通匿名函数的情况下不可能。两个函数都是闭包 在保持以前的变量状态的同时仍然表现不同。 例如:
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
多次更改。