2011-10-06 18 views
14

javascript apply()メソッドを使用して関数を呼び出すとします。関数に引数がない場合、これはうまくいきます。上記JavaScriptで引数を指定してメソッドを呼び出す

function test(msg) 
{ 
    console.log(msg); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test(this).apply(body); // mysteriously returns the correct result, then 
// typeError: 'undefined' is not an object (evaluating "test(this).apply". 

例は完全に些細ですが、私の質問の粒がある:すなわち

function test() 
{ 
    console.log(this); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test.apply(body); // returns [object HTMLBodyElement] 

しかし、私は引数を持つ関数を呼び出すために同じことを行うように見えることはできませんどのようにapply()メソッドを使用して引数を持つ関数を呼び出します。

答えて

26

applyある2つの引数を取ります。

test.apply(null, [body]); 

関数が実行されるとき、最初の引数はthisの値を設定します。 2番目は、その関数のパラメータの配列です。

あなたは次のように書き換えることができ、あなたの例では

function test() { 
    console.log(this); 
} 

をし、次のようにそれを呼び出す:

test.apply(this); 
+0

2番目の引数は、単一の要素ではなく配列でなければならないことに注意してください。 'test.apply(null、body)'は私のために壊れますが(Chrome 35)、 'test.apply(null、[body])'は動作します。 – FeifanZ

+0

適用メソッドを使用する実際の使用方法は何ですか? – Thunder

+1

本当のホストがたくさんあると確信しています。春の気になるのは、モンキーパッチ関数(組み込み関数を含む)、[variadic関数](http://en.wikipedia.org/wiki/Variadic_function)、そしてコールバック関数に 'this'を指定することです。 –

6

では、あなたが2番目の引数として、引数の配列を送信適用されます。ここでは

test.apply(body,["Hello World"]); 

はMDNドキュメントのドキュメントを適用https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

+0

ありがとうございました:) – dkugappi

+0

@JohnKeyesが正しければ、コピーと貼り付けにもっと注意を払う必要がありました。私は構文エラーを修正しました。 – bittersweetryan

+0

あなたの好きなところに私のコメントをここで削除します。彼らは答えに加えていません。 –

0

は、引数に追加してください:

test.apply(body, ["my message here"]); 
8

ファーストあなたが実際にあなたの関数を実際に呼び出していることに注目してください。行:

最初に、あなたが引数として this を渡すtest関数を呼び出し、その後、あなたはあなたの関数は何も返さないので、undefinedある関数の結果、上applyプロパティにアクセスしようとするため
test(this).apply(body); 

は失敗します。

undefinedの値にアクセスすると、TypeError例外が発生します。

さて、あなたはtestthis値として、外this値を設定し、あなたの関数の引数としてbody変数の値を渡したい場合は、あなたが行うことができます、あなたが実際に何をしたいかを見てみましょう:

test.apply(this, [body]); 

しかしcall方法が存在する理由それはあなたが何のために配列を作成する必要はありません正確にどの引数を渡すために、知っているとき、あなただけの引数を渡す、だ:

test.call(this, body); 

applyメソッドは、動的な引数の数を扱うときに、どの引数が渡されるべきかを知っていて、の値を設定する能力を持っているときに、本当に役に立ちます。callは必要なものです。

+0

' call'のドキュメント:https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function/call –

関連する問題