.apply()を使用し、コンテキストと同じインスタンスを渡すことは理にかなっていますか?

StackOverflow https://stackoverflow.com/questions/8315744

質問

O'ReillyからJavaScript Webアプリケーションを読んでいます。本のさまざまな時点で、著者は以下に沿って何かを使用しています。

instance.init.apply(instance, arguments);

これは理にかなっていますか?これはまったく同じではありません:

instance.init(arguments);

.call()および.apply()は、関数の実行コンテキストを手動で設定するために使用されます。とにかく元の実行コンテキストを使用するつもりであるのに、なぜそれらを使用する必要があるのですか?

役に立ちましたか?

解決

ポイントはそれです arguments アレイのようなオブジェクトです。やっている...

instance.init(arguments);

...特定の引数を含む配列のようなオブジェクトである1つの引数を渡します。一方、やっています...

instance.init.apply(instance, arguments);

...配列のようなオブジェクトを渡します 別々の議論として. 。設定は事実です instance あなたがすでにそれを書いたので、ちょっと役に立たないですが、使用する場合 .apply あなたは単に設定する必要があります this 価値も。

違いの簡単な例:

function log(a, b, c) {
    console.log(a, b, c);
}

function log2() {
    log.apply(null, arguments); // `this` value is not meaningful here,
                                // it's about `arguments`
}

function log3() {
    log(arguments);
}

log(1, 2, 3);  // logs:  1, 2, 3

log2(1, 2, 3); // logs:  1, 2, 3

log3(1, 2, 3); // logs:  <Arguments>, undefined, undefined
               //        where <Arguments> contains the values 1, 2, 3

他のヒント

Apply()を使用して、その例では、instance.init()が別の関数/式から実行される場合、domwindowの代わりに「this」===インスタンスを保証します。

var x = function(){ debugger; },
    y = function(){ x.apply(x, arguments); },
    z = function() { x(arguments); };

y("abc", true, []); // this === x
z("abc", true, []); // this === DOMWindow

それは単にコンテキストを指定することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top