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" 但这不会使它成为一个...这只是我每次想使用该参数时必须引用的名称。
在数组上实现回调时,例如在下划线的 _.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" 但这不会使它成为一个...这只是我每次想使用该参数时必须引用的名称。