Javascriptのapply()メソッドを使用して関数を呼び出したいと思いました。関数に引数がない場合、これは正常に機能します。つまり.
function test()
{
console.log(this);
}
body = document.getElementsByTagName("body")[0]; // shortcut to body element
test.apply(body); // returns [object HTMLBodyElement]
しかし、引数を持つ関数を呼び出すために同じことをすることはできないようです。
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".
上記の例は完全に些細なものですが、私の質問の要点は次のとおりです。apply()メソッドを使用して引数付きの関数を呼び出すにはどうすればよいですか。
apply
は2つの引数を取ります:
test.apply(null, [body]);
最初の引数は、関数の実行時にthis
の値を設定します。 2つ目は、その関数のパラメーターの配列です。
あなたの例では、次のように書き直すことができます。
function test() {
console.log(this);
}
そしてそれを次のように呼びます:
test.apply(this);
最初に、実際に関数をすぐに呼び出していることに注意してください。
test(this).apply(body);
最初にtest
を渡してthis
関数を呼び出します引数として、次に関数の結果のapply
プロパティにアクセスしようとします。これは、関数が何も返さないため、undefined
です。
undefined
値へのそのプロパティアクセスにより、TypeError
例外が発生します。
さて、実際に何をしたいのか見てみましょう。body
変数の値を関数の引数として渡し、外側のthis
値をthis
のtest
値として設定する場合は、次のことができます。
test.apply(this, [body]);
しかし、それがcall
メソッドが存在する理由です。渡す引数が正確にわかっている場合は、何もせずに配列を作成する必要はありません。引数を渡すだけです。
test.call(this, body);
apply
メソッドは、たとえば動的な数の引数を処理する場合、どの引数を渡したいかがわかっていて、this
値を設定する機能がある場合に、非常に便利です。call
はまさに必要なものです。
Applyを使用すると、2番目の引数として引数の配列を送信します。
test.apply(body,["Hello World"]);
MDNドキュメントの適用ドキュメントは次のとおりです https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
必ず引数を追加してください:
test.apply(body, ["my message here"]);