功能循环的可能解决方案

Ani*_*dia 5 javascript loops function

我正在阅读John ResigLearning Advanced JavaScript幻灯片.

当我来到幻灯片-27时,约翰提出了一个测验,如下所示:

测验:我们如何通过回调实现循环?

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."); 
});
Run Code Online (Sandbox Code Playgroud)

我试图实现,并提出以下代码:

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.");
});
Run Code Online (Sandbox Code Playgroud)

我很高兴它有效,并渴望看到下一张幻灯片与解决方案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."); 
});
Run Code Online (Sandbox Code Playgroud)

对于他传递的fn函数loop(),他添加了另一个参数i.

这让我想知道为什么需要另一个参数?

Bar*_*mar 1

在正常for循环中,主体可以访问索引i。如果回调解决方案旨在替代此解决方案,则它也应该提供此信息。例如,它对于创建唯一标识符可能很有用。所以我们将它作为参数传递。