为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
Why do javascript variables in closure functions not reset to a default when called multiple times?
在下面的代码中,有人可以向我解释为什么多次调用counter
会导致每次调用时i
的值增加?
我的理解是,正如我们在makeCounter
中专门设置i = 0;
一样,每次通过counter
变量调用makeCounter
时,i
都应该重置为0。我不明白为什么情况并非如此。
function makeCounter() {
// `i` is only accessible inside `makeCounter`.
var i = 0;
return function() {
console.log( ++i );
};
}
// Note that `counter` and `counter2` each have their own scoped `i`.
var counter = makeCounter();
counter(); // logs: 1
counter(); // logs: 2
每次通过"计数器"变量调用makeCounter时
这是错误的。
你只给makeCounter()
打电话一次——在var counter = makeCounter();
。
counter
是对返回函数的引用,该函数在 i
变量上关闭。
调用counter()
将执行此返回的函数,就像任何其他函数一样。
如果您多次编写makeCounter()()
,则会发生预期的行为。
每次 makeCounter 都被称为 [...]
i
应重置为0
没错。
makeCounter
通过counter
变量调用
不,不是。makeCounter
返回的匿名函数使用 counter()
调用。 makeCounter
只调用了一次,但其结果被分配给counter
变量。
请注意,
counter
和counter2
都有自己的作用域i
是的,情况就是这样。但是,您的示例不完整:
var counter = makeCounter();
counter(); // logs 1
var counter2 = makeCounter();
counter2(); // logs 1 again!
counter(); // still logs 2
counter2(); // logs 2
相关文章:
- 我的shareService在angular 2中发送值工作正常,但当我渲染我的另一个组件时,会获得默认值
- jquerydatetimepicker日期和时间应在框默认值中,而无需单击框
- 如果值为空,如何设置输入的默认值?jQuery
- 骨干模型默认值-todos.js示例中不必要的代码
- jquery日期选择器年份范围默认值
- Html5输入属性的默认值,如最小值、最大值、大小等
- 根据两个下拉列表的默认值禁用按钮
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- Angularjs-设置不带ng选项的select的默认值
- jQuery Datepicker从日期开始设置默认值
- 如何设置浏览器打开的文件对话框的文件名(一些默认值)
- 在这种情况下,调用阻止默认值
- 在下拉列表中加载默认值并调用 onchange 事件
- AngularJS - 选择 - 服务器调用的默认值
- 为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
- AWS Lambda调用函数(js sdk): timeout重置为默认值
- 从 JavaScript 调用@JSFunction,类型错误:找不到对象的默认值
- 如何设置通过 AJAX 从另一个页面调用的下拉列表的默认值
- Javascript:如果参数未作为函数调用,则返回默认值
- 使用AJAX调用在select2中设置默认值