web-dev-qa-db-ja.com

JavaScriptの引数を使用してapplyメソッドを呼び出す

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()メソッドを使用して引数付きの関数を呼び出すにはどうすればよいですか。

17
dkugappi

apply は2つの引数を取ります:

test.apply(null, [body]);

最初の引数は、関数の実行時にthisの値を設定します。 2つ目は、その関数のパラメーターの配列です。

あなたの例では、次のように書き直すことができます。

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

そしてそれを次のように呼びます:

test.apply(this);
30
John Keyes

最初に、実際に関数をすぐに呼び出していることに注意してください。

test(this).apply(body);

最初にtestを渡してthis関数を呼び出します引数として、次に関数の結果のapplyプロパティにアクセスしようとします。これは、関数が何も返さないため、undefinedです。

undefined値へのそのプロパティアクセスにより、TypeError例外が発生します。

さて、実際に何をしたいのか見てみましょう。body変数の値を関数の引数として渡し、外側のthis値をthistest値として設定する場合は、次のことができます。

test.apply(this, [body]);

しかし、それがcallメソッドが存在する理由です。渡す引数が正確にわかっている場合は、何もせずに配列を作成する必要はありません。引数を渡すだけです。

test.call(this, body);

applyメソッドは、たとえば動的な数の引数を処理する場合、どの引数を渡したいかがわかっていて、this値を設定する機能がある場合に、非常に便利です。callはまさに必要なものです。

8
CMS

Applyを使用すると、2番目の引数として引数の配列を送信します。

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

MDNドキュメントの適用ドキュメントは次のとおりです https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

6
bittersweetryan

必ず引数を追加してください:

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