2016-05-24 8 views
2

アンダースコアの_.invoke関数を実装しようとしています。これは、次のようになります。リストの各値に対してmethodNameで指定されたメソッドを呼び出します。呼び出すために渡された余分な引数は、メソッド呼び出しに転送されます。ここアンダースコアのインボーク関数を実装するときに.applyが必要な理由を理解しようとしています

と実装です:

_.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使用する必要がある理由を理解していません。適用と単純書き込みの使用の違いは何ですか?return functionOrKey(item, args)

+0

まずとして呼出し関数で現在のコンテキストを使用=

methodName.apply(item, arguments); 

ランstrictモードではnameが無効です。 – Bergi

答えて

0

Function.prototype.applyの最初の引数は、呼び出された関数内でthisの値を設定します。だから、

methodName.apply(item, arguments); 

を書くことitemはメソッドmethodNameを持っていませんが、あなたはそれがitemの財産であるかのようにmethodNameを使用したい場合は、あなたがapplyを使用する必要が

item.methodName(argument1, argument2 /*, ...*/); 

と同じです(上記のように各引数が何であるか分かっていればcall)。

0

違いはコンテキストです。 call/applyを使うと、呼び出された関数に 'this'が何であるかを指定することができます。これにmethodNameに

アイテム、
return functionOrKey(item, args) 

パラメータ/変数として `arguments`を使用して、全ての 'この'

関連する問題