在实现下划线调用函数时,试图理解为什么.apply是必要的

时间:2016-05-24 05:30:24

标签: javascript

我正在尝试实现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)之间的区别是什么?

2 个答案:

答案 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'