我正在尝试实现Underscore JS的_.invoke功能。以下是它应该做的事情:在列表中的每个值上调用methodName命名的方法。传递给调用的任何额外参数都将被转发到方法调用。
以下是实施:
_.invoke = function(list, methodName, arguments) {
return _.map(collection, function(item){
if (typeof methodName === 'string'){
return item[methodName](arguments);
} else {
return methodName.apply(item, arguments);
}
});
};
我目前正在学习.call和.apply方法,并且不了解为什么我需要在这种情况下使用.apply。使用apply和简单地写return functionOrKey(item, args)
之间的区别是什么?
答案 0 :(得分:0)
Function.prototype.apply的第一个参数在调用的函数中设置this
的值。所以写作
methodName.apply(item, arguments);
与
相同item.methodName(argument1, argument2 /*, ...*/);
如果item
没有方法methodName
,但您想使用methodName
,就好像它是item
的属性一样,那么您需要使用apply
(如果您知道每个参数是什么,则为call
),如上所示。
答案 1 :(得分:0)
区别在于背景。通话/申请允许您指定'这个'在被调用的函数中。
Output1_0_A.csv
-0.5458808
0.5365853
Output2_0_A.csv
0.002311942
-1.316908124
Output1_2_B.csv
0.4445853
-0.4664951
-0.8483700
使用this = item运行methodName,其中
methodName.apply(item, arguments);
使用调用函数中的当前上下文作为' this'