2012-05-13 5 views
3

初心者の質問は間違っていますが、私はこの問題を回避するのが難しいです。私は、関数testFに配列を渡すと、配列の各行に含まれるオブジェクトにアクセスできるの$ .eachを使用してjavascriptのオブジェクトに関数を適用する

$.each(array, testF); 

function testF(){ 
    console.log(this.name); 
} 

:jqueryのを使用して、私はこのような何かを行うことができます。しかし、私が次のようなことをしようとすると:

array[0].testF() 

私はオブジェクトに 'testF'というメソッドがないことを示すエラーが発生します。誰かがここで何が起きているのかを説明できるのかどうか疑問に思っています...なぜjQueryがうまくいくのですか。もう一度、初心者の質問をしてください。

答えて

4
    $.each(array, testF)
  • elemに結合thisと、アレイ内の各要素に対してtestF(i, elem)を呼び出します。
  • array[0].testF()試みは$.each()が何をするかの相当testF.call(array[0], 0, array[0])であるか、引数を使用していないので、あなたはtestF.call(array[0])

    を行うSIMPLドキュメントについてMDNを参照してくださいすることができますarray[0]

上に存在するメソッドtestF()を呼び出すには.call()

+0

jQueryは 'this'を' testF'にどのように結び付けていますか? –

+2

['.call()'](https://developer.mozilla。org/ja/JavaScript/Reference/Global_Objects/Function/call); JavaScript内のすべての関数にメソッドがあります。 'callback.call(object [i]、i、object [i ++])' – ThiefMaster

+0

今日は新しいことを学んだだけです! –

2

のようなので、それを実行します。

testF.call(array[0]); 

call関数法は、あなたが関数呼び出しのコンテキスト(this値)を設定することができます。したがって、fn();ではなくカスタムコンテキストで関数を呼び出す場合は、fn.call(context);を実行します。

+0

+1 bravoŠime! –

1

これは、オブジェクト配列[0]に関数testFがないためです。 最初に宣言する必要があります。そのような :あなたはarray[0].testF()を書くとき

array[0].testF = function testF() 
{ 
    console.log(this.name); 
} 

array[0].testF(); 
1

、この手段:

  • がかかり、こと内のインデックス"0"
  • 下の要素を取る変数array
  • を見上げてインデックス下の要素"testF"
  • D(またarray[0]に特殊変数thisを割り当てる)機能

としてそれを実行しかし、ほとんどの状況では、array[0]は、属性を持たないであろうtestF定義。事前にこれを行う場合は、

array[0].testF = testF; 

となります。

+0

私はその要素の "testF"というプロパティを "Lookup"に置き換えます。 – ThiefMaster

+0

@ThiefMaster:十分な公正。 JavaScriptの配列は数値のプロパティ名を持つ特殊なオブジェクトなので、私はその等価性を示すことを意図していました。 – Amadan

+0

私はステップバイステップの説明に感謝します。ありがとう。 – bento

関連する問題