JavaScript 下划线 _.each:为什么在引用 object/array 属性时回调参数的顺序很重要?

JavaScript Underscore _.each: Why does the order of a callback's arguments matter when referencing object/array properties?

在数组上实现回调时,例如在下划线的 _.each 方法中,为什么在访问数组或对象的属性时回调参数的顺序很重要?例如:

_.each([1,2,3,4,5], function(item, index, arr) { 
  console.log(item + ', ' + index + ', ' + arr);
});
//output: 1, 0, [1,2,3,4,5];
//output: 2, 1, [1,2,3,4,5];
//output: 3, 2, [1,2,3,4,5];
//etc. until output: 5, 4, [1,2,3,4,5];

_.each({key1: 1, key2: 2, key3: 3}, function(value, key, obj){
  console.log(value + ', ' + key + ', ' + obj)
});
//output: 1, key1, [object Object]
//output: 2, key2, [object Object]
//output: 3, key3, [object Object]

为什么输出如上所示?是否有某处规定回调的第一个参数引用对象的值,第二个参数引用对象的键或索引,第三个参数引用对象本身?

这就是 ecmascript 规范定义它工作的方式

forEach 的 ECMAScript 规范:

callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18

您的 link 有帮助!我也找到了一个更准确的答案,因为我刚才正在搜索更多:

underbar 将 _.each 定义为:

function _.each(collection, callback){
 if(Array.isArray(collection)){
  for(var i = 0; i < collection.length; i++){
    callback(collection[i], i , collection);
  }
 } 
 else {
  for(var key in collection){
    callback(collection[key], key, collection);
  }
 }
}

我看到 _.each 确实在其 if/else 语句中的两个 for 循环中定义了回调的参数。

值可以是字符串...值可以是数字...键可以是字符串或数字...值可以是对象...引用的集合可以是对象...数组可以有其他数组作为值,它们可以将对象作为值......它们可以将字符串作为值,这些值可能与某些对象的键相同......对象可以将其他对象作为值......它们可以将数组作为值...... .或与同一对象上的另一个键相同的字符串...等等等等等等

如果你不知道第一个参数代表一个特定的事物,第二个参数代表另一个特定的事物,第三个参数代表另一个,你怎么知道什么是什么?

因此,当创建函数时,它通过调用回调的方式定义了哪个参数将是哪个东西。他们必须按某种顺序……他们选择了那个顺序。可能是因为它符合原生 .forEach 的工作方式。


您可能对这些参数的命名感到困惑,认为名称可以以某种方式发挥作用...例如命名参数 "value" 应该收到 "value",因此第一个或第二个参数是名为 "value" 的参数有什么关系?

这不是它的工作原理。您可以将参数命名为任何有效的变量名……它实际上不会影响它的作用。没有预定义的方法你必须命名参数才能得到某些东西......如果有它真的会限制语言的能力。我可以将该参数命名为 "flyingSpaghettiMonster" 但这不会使它成为一个...这只是我每次想使用该参数时必须引用的名称。