我正在阅读John Resig的Learning Advanced JavaScript幻灯片。
当我来到slide-27时,约翰提出了一个测验,如下所示:
QUIZ:我们如何使用回调实现循环?
function loop(array, fn){
for ( var i = 0; i < array.length; i++ ) {
// Implement me!
}
}
var num = 0;
loop([0, 1, 2], function(value){
assert(value == num++, "Make sure the contents are as we expect it.");
assert(this instanceof Array, "The context should be the full array.");
});
我试图实现,并提出以下代码:
function loop(array, fn){
for ( var i = 0; i < array.length; i++ ) {
fn.call(array, array[i]);
}
}
var num = 0;
loop([0, 1, 2], function(value){
assert(value == num++, "Make sure the contents are as we expect it.");
assert(this instanceof Array, "The context should be the full array.");
});
我很高兴它有效,并且渴望看到下一张幻灯片与解决方案john进行比较将在下一张幻灯片中提供。
但是在下一张幻灯片中,约翰提供了以下解决方案:
function loop(array, fn){
for ( var i = 0; i < array.length; i++ )
fn.call( array, array[i], i );
}
var num = 0;
loop([0, 1, 2], function(value, i){
assert(value == num++, "Make sure the contents are as we expect it.");
assert(this instanceof Array, "The context should be the full array.");
});
他传递给loop()
的fn函数,他添加了另一个参数i
。
这让我想知道为什么需要另一个参数?
答案 0 :(得分:1)
在正常的for
循环中,正文可以访问索引i
。如果要将回调解决方案替换为此,则还应提供此信息。例如,它可用于创建唯一标识符。所以我们将它作为参数传递。