4

私は現在、 John Resigの Secrets of the JavaScript Ninja を勉強しており、誰かがその例の 1 つをさらに理解するのを手伝ってくれることを願っています。

オブジェクトでメソッドのオーバーロードを可能にする関数であり、各オーバーロードには独自の定義と動作があります。彼はここでそれについてブログを書きました。

コードは次のようになります。

function addMethod(object, name, fn) {
   var old = object[name];

   object[name] = function(){
      if (fn.length == arguments.length)
         return fn.apply(this, arguments)
      else if (typeof old == 'function')
         return old.apply(this, arguments);
};

そして、このように使用されます:

addMethod(obj,'funcName',function(){});
addMethod(obj,'funcName',function(a){});
addMethod(obj,'funcName',function(a,b){});

これがどのように機能するかはほとんど理解していると思いますが、上記のブログ投稿よりも詳しい説明を得ることができます)。

ただし、クロージャーの値にアクセスし、クロージャーoldfn使用しています。これについてはまだ調査中です。

編集 - 以下に追加jsFiddle

それを理解しようとすると、改行fn.apply(this, arguments)は単純return fn()に同じ結果と思われるものになる可能性があることに気付きました。このjsFiddleの例を参照してください。

applyでは、必要でないのになぜ構文を使用しているのでしょうか?

適用せずにjsFiddleの例を試してみましたが、常に問題があるようです

また、特に次の場合に、これらの関数を返すときに正確に何が起こっているのか:

return old.apply(this, arguments);

この方法の使用方法だけでなく、なぜそれが機能するのかをしっかりと理解したいので、洞察をいただければ幸いです.

ありがとう

4

6 に答える 6

1

Javascript ではthis、関数参照にアクセスするために使用されたオブジェクトに応じて、関数の宣言の瞬間ではなく、実行の瞬間に変数が設定されます。

を使用する必要がapplyあるのは、前述の の動的バインドのためだけでthisなく、事前にいくつの引数があるかわからないためでもあります。soapplyは引数のリストを受け取り、リストの各要素を個々の引数として関数に渡します。

于 2013-08-08T09:25:07.083 に答える
1

私はあなたがポイントを逃していると思います.apply

私はそれを説明しようとはしません :P 次のような多くの良い説明を見つけることができます:

tl;dr

.applyコンテキストを設定できますthis.apply引数を配列として渡すことができるため、可変数の引数を使用できます。

于 2013-08-08T09:16:59.870 に答える
0
fn.apply(this, arguments)

fnwiththisを現在のパラメータthisおよびパラメータとして呼び出しargumentsます。

fn()

fnthis等しいwindowor undefined(「非厳密モード」か「厳密モード」かによって異なります)をパラメーターなしで呼び出します。

このMozilla.orgthisページには、 (常に役立つ)についての良い議論があります。

于 2013-08-08T09:19:02.023 に答える