.apply()を使用し、コンテキストと同じインスタンスを渡すことは理にかなっていますか?
-
25-10-2019 - |
質問
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
それは単にコンテキストを指定することです。
所属していません StackOverflow