0

call() メソッドの仕組みを理解しようとしています。Firebug Javascript コンソールで実行した次のコード スニペットがあります。

コード:

var window = {num1: 10, num2: 20};
var o = {num1: 20, num2: 30};

var sum = function(num1, num2) {
    return this.num1 + this.num2;
};

console.log(sum.call(o)); // 50
console.log(sum.call(window)); // 30
console.log(sum.call(this)); // 30

出力:

50
NaN
NaN

出力はそれぞれ 50 と 30 になると予想していました。window/this オブジェクトが実行コンテキストとして渡されると、call() が NaN を返すのはなぜですか?

4

2 に答える 2

2

ウィンドウ変数を宣言すると、現在のスコープのウィンドウ オブジェクトをステップオーバーします。これにより、予期しない動作が発生する可能性があります (私のブラウザー、Firefox では、50、30、NaN になります)。最初の行を次のように変更します。

window.num1 = 10; window.num2= 20;

これにより、num1 と num2 がグローバル ウィンドウ プロパティに割り当てられます (良い考えではありません)。

別の注意として、call は最初の引数をコンテキスト (this) として渡します。関数宣言の params は不要です。引数で配列を渡したい場合は、apply を使用します。

var myArgs = [10, 20];
sum.apply(window, myArgs);

渡された引数を合計するには、関数本体から this 修飾子を削除する必要があります。

于 2013-09-26T18:31:21.837 に答える
0

これらのテストはどのような環境で行っていますか? windowすべてのブラウザでグローバル オブジェクトとして機能するホスト オブジェクトです。グローバル コンテキストの変数でオーバーライドすることはできません。

したがって、呼び出すときwindowは、num1 プロパティまたは num2 プロパティが関連付けられていないグローバル オブジェクトを呼び出しています。あなたがした場合

var num1 = 10, num2 = 20;

ログの期待値が得られます。

これは、グローバル スコープで変数を割り当てると、それらがウィンドウのプロパティとして割り当てられるためです。

this値は呼び出し時に決定され、グローバル コードからこれを参照すると、window オブジェクトを参照するため、3 番目のケースで機能します。

于 2013-09-26T18:32:58.110 に答える