自调用函数不保留私有值
self invoking function is not preserving the private value
试图弄清楚为什么自调用函数保留了私有值,而其他类型的则没有。
确实增加了价值
var a = function(){
var myval=10;
return function(){
return myval++;
}
}();
console.log(a());
console.log(a());
console.log(a());
输出 : 10,11,12
虽然此代码不会增加值
var a = function(){
var myval=10;
return function(){
return myval++;
}
};
console.log(a()());
console.log(a()());
console.log(a()());
输出:10,10,10
在你的第一个示例中,a 是一个闭包实例,在你的console.log
中被重复调用:
console.log(a()); // <-- a is a closure, invoked once
console.log(a()); // <-- the same closure, invoked the second time
console.log(a()); // <-- the same closure, invoked a third time
但是,在第二个示例中,a 是在 console.log
s 中重复调用的外部函数:
console.log(a()()); // <-- a is the outer, returning a new closure, invoked once
console.log(a()()); // <-- a is the outer, returning a new closure, invoked once
console.log(a()()); // <-- a is the outer, returning a new closure, invoked once
因此,您在第二个示例中所做的是每次都重新创建一个新的闭包,而不是重新调用与第一个示例中相同的闭包实例。
在第一种情况下,外部函数只被调用一次,但在第二种情况下,你调用它三次,每次你初始化闭包的单个myval
回到 10; 所以最后你有三个单独的myval
副本,它们的值都是 11,从递增一次开始。
您的第一个示例更等效于:
var a = function(){
var myval=10;
return function(){
return myval++;
}
};
var b = a();
console.log(b());
console.log(b());
console.log(b());
而你的第二个是这样的:
var a = function(){
var myval=10;
return function(){
return myval++;
}
};
var b = a();
var c = a();
var d = a();
console.log(b());
console.log(c());
console.log(d());
每次调用 a()
都会创建一个新的内部函数,因此在第一种情况下,您调用a
一次,您有一个内部函数在作用域中具有单个myval
,但在第二种情况下,您创建了三个单独的内部函数,每个函数在作用域中都有自己的myval
。
相关文章:
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 自调用函数不保留私有值
- 使用promise.then时,是否可以保留在单击事件调用堆栈中
- 保留 Azure 移动服务的自定义 API 调用的用户身份验证
- 为什么如果失败,我无法保留调用 api
- 包装“控制台.log”并保留调用堆栈
- 如何在回发上保留选定的选项卡或以编程方式调用之前激活方法
- 在对 FB.api 进行异步调用时保留变量值
- 使用javaScriptSupport.addInitializerCall调用fnStandingRedraw以保留D
- 在保留状态的同时调用原型方法
- 如何在ajax调用后保留toggleClass事件状态
- 如何在Spring MVC中使用AJAX调用时保留搜索过滤器值
- 为什么在这种情况下调用 ES6 时“产生”是一个保留字
- 剑道UI输入焦点-在选择和Ajax调用之后,下拉列表保留焦点
- 如何在调用函数后保留标签的值
- 如何在ajax调用后保留页面的旧内容
- 如何通过各种调用保留特定的项id
- 词法作用域变量在getJSON调用中被覆盖后仍保留其值
- 对ClientScript的调用不保留网页控件中的值
- 如何编写一个能够在调用之间保留值的Javascript函数