作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个像这样的回调数组:
function createFunctions(n) {
var callbacks = [];
for (var i=0; i<n; i++) {
callbacks.push(function() {
return i;
});
}
return callbacks;
}
而且,这是我正在使用的测试:
var callbacks = createFunctions(5);
for (var i=0; i<callbacks.length; i++) {
Test.assertEquals(callbacks[i](), i, 'Function with index ' + i);
}
基本上,我希望回调返回它在数组中的索引(即 callback[1]()
应该返回 1)。但是,i
当测试运行时,createFunctions 中定义的值设置为 6,因此它们始终返回 6。我尝试创建一个局部变量来保存匿名函数中的值,但这也不起作用。
有什么想法可以让这项工作发挥作用吗?
最佳答案
闭包对它所关闭的变量有一个持久引用,而不是它们创建时的值的副本。这就是为什么所有函数都会看到 6
:这是调用这些函数时 i
所具有的值。
如果您需要它们看到不同的值,请将闭包关闭在其他不会改变的内容上。这是一种方法:
function createFunctions(n) {
var callbacks = [];
for (var i=0; i<n; i++) {
callbacks.push(makeCallback(i));
}
return callbacks;
function makeCallback(index) {
return function() {
return index;
};
}
}
或者:
function createFunctions(n) {
var callbacks = [];
for (var i=0; i<n; i++) {
callbacks.push(makeCallback(i));
}
return callbacks;
}
function makeCallback(index) {
return function() {
return index;
};
}
(在此示例中,makeCallback
位于 createFunctions
内部还是外部并不重要。)
现在,回调将在包含 index
参数的上下文中关闭。他们各自获得该上下文的自己副本(通过调用makeCallback
函数创建),因此由于index
没有任何变化,它的值保持不变。
更多(在我的博客上):Closures are not complicated
关闭变量上下文的闭包功能非常非常有用。考虑:
function allocator(start) {
return function() {
return ++start;
};
}
var f = allocator(0);
alert(f()); // "1"
alert(f()); // "2"
alert(f()); // "3"
如果 allocator
创建的函数具有 start
的值副本,则该方法不起作用。它之所以有效,是因为由 allocator
创建的函数具有对变量本身的引用(通过上下文)。
关于javascript - 如何在javascript中获取闭包中变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196754/
我是一名优秀的程序员,十分优秀!