2012-01-27 5 views
2

Javascriptのfunction.apply()の周りを頭で囲んでいます。オブジェクトobj上にマッピングthisの関数の内部使用に、与えられた引数argsと機能fを実行するために f.apply(obj,args)jQueryセットに設定したときにfunction.applyの "this" argを理解しています

:あなたはこのようにそれを使用しています。

var o = { 
    state : 0, 
    plus : function(){ 
    this.state += 1; 
    } 
} 
//o is an object with a state-tracking var and a function that will operate on it 
o.state 
// 0 
o.plus() 
o.state 
// 1 
newO = {state:3} 
// newO is similar to the original object, but doesn't have that state-manipulating function 
newO.state 
// 3 
o.plus.apply(newO,[]) // call o's function, but hijack the 'this' reference to point to newO 
newO.state 
// 4 

クール:

は、ここでそのすべてがアップするスピード私たちを取得するためにどのように動作するかを示すための簡単な例です。だから私は、特定のjqueryプラグインを使用してJavaScriptでnullポインタの問題を解決する関数を書いた。 jQueryのセットが空の場合、それだけで機能を実行しません:それは複数の要素のjQueryのセットに一般うかどうかを確認するにはapplyIfPresent($("input"),"css",["background","blue"]);

var applyIfPresent = function(jqObj,func,args){ 
    //only works if jquery has the func you supply 
    if(jqObj.length){ 
    jqObj[func].apply(jqObj,args); 
    } 
} 

私は簡単なテストを実行しました。それはうまくいくようですが、jQueryの内部とthisの使い方がどのようにそのスキーマに変換されるのか分かりません。私はそれが魔法のように動作するように思えるが、正直なところ、私は魔法を少し恐れることを学んだ。

f.applyまたはjQueryがそれをどのように機能させるにはどうすればよいですか?

+1

を行うのと同じです。 ( 'Function.apply')はちょうど"標準 "JavaScriptであるので、どういう疑問がありますか? –

+0

' apply'の仕組みを知っているようですが、jQueryのAPIの使い方を知っているようです。私はあなたが実際にあなたを混乱させているのは明らかではないと思います。あなたの 'applyIfPresent()'関数は、 'length'プロパティ、jQueryを持つオブジェクトで動作します。 –

+1

'length'がゼロの場合、jQueryメソッドはノーオペレーションですか?私。 '' input() ''と入力します。 '' input() ''、 '' blue '') 。 – Domenic

答えて

2

それはあなたが上記の例で完全にそれを理解するように見える、その魔法ではありません。
あなたが

jqObj[func].apply(jqObj,args); 

を行うときに、それは基本的に[jQueryのためのソース](https://github.com/jquery/jquery)が利用可能である

$(jqObj).func(args); 
関連する問題