1

John Resig 著の「Secrets of the JavaScript Ninja」という本を読んでいます。その中で彼は、オブジェクトのプロトタイプを次のコードで拡張することにより、言語の将来の機能を予測する方法を説明しています。

if(!Array.prototype.forEach){
   Array.prototype.forEach = function(fn, callback){
      for(var i = 0; i < this.length; i++){
         fn.call(callback || null, this[i], i, this);
      }
   };
}

これで、「callback || null」ステートメントにより、未定義の可能性のある値が「call」関数に渡されないことがわかりました。私が理解していないのは、「fn」パラメーターのコンテキストとして null を渡すことの結果がどうなるかということです。それはコードをクラッシュさせませんか?

あなたが提供できる説明や啓発に感謝します。

4

3 に答える 3

1

これには「実際の」問題はありません。コンテキスト「this」はnullに等しいだけです。これは、コンテキストに適切な値がない場合に.call()または.apply()を使用する場合の一般的な方法です。

于 2012-08-10T17:39:12.443 に答える
1

Function.callの最初のパラメーターは、関数を実行するスコープです。そのパラメーターがfalsey(falseynullの1つの形式)の場合、グローバルスコープでその関数を実行します。ブラウザでは、これは関数がにthis設定された状態で実行されることを意味しますwindow

は必要ありません。スコープとしてcallback || null渡す場合は、を使用します。おそらく、いくつかのあいまいなブラウザまたはそうでない状況がありますが、それはResigがそれを行った理由を説明します。undefinedwindow

于 2012-08-10T17:39:15.963 に答える
0

いいえ、クラッシュは発生しません。https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/callによると:

[…]メソッドが非厳密モードコードの関数でnullありundefined、グローバルオブジェクトに置き換えられ、プリミティブ値がボックス化される場合。

(Webページの場合、「グローバルオブジェクト」はwindowです。)

于 2012-08-10T17:39:07.787 に答える