3

と混同していfn.applyます。例えば、

このスニペットを検討してください

Array.min = function(){
    return Math.min.apply( Math, arr );
}

これは把握できます。fn.apply を次のように理解しています。

指定された this 値と配列として提供された引数を使用して関数を呼び出します

ただし、以下のスニペットも機能します

Array.min = function(){
    return Math.min.apply( null, arr );
}

Array.min = function(){
    return Math.min.apply( undefined, arr );
}

MDN はこれを次のように説明しています。

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

太字にした部分がよくわかりません。その声明の意味は何ですか?誰かが少し詳しく説明できますか?

4

2 に答える 2

9

「グローバル オブジェクト」はグローバル オブジェクトです。仕様を読むだけです:

一意のグローバル オブジェクトは、制御が実行コンテキストに入る前に作成されます。

この仕様で定義されたプロパティに加えて、グローバル オブジェクトには追加のホスト定義プロパティがある場合があります。これには、値がグローバル オブジェクト自体であるプロパティが含まれる場合があります。たとえば、HTML ドキュメント オブジェクト モデルでは、グローバル オブジェクトのwindowプロパティはグローバル オブジェクトそのものです。

ブラウザでは、基本的に を呼び出しMath.min.apply(window, arr)ており、これを確認できます。

(function() {
    console.log(this);  // Logs `Window {...}`
}).apply(undefined);

これは非厳密モードの多くの問題の 1 つです。thisになることがwindowあり、黙ってグローバル プロパティを作成することになります。厳密モードでthisは、真に次のようになりますundefined

(function() {
    'use strict';

    (function() {
        console.log(this);  // Logs `undefined`
    }).apply(undefined);
})();

「プリミティブ値はボックス化されます」は、プリミティブ自体はオブジェクトではないため、数値や文字列などのプリミティブがコンテナー オブジェクトに「ボックス化」されることを示しています。繰り返しますが、これを確認できます。

(function() {
    console.log(this);  // Logs `Number {}`, not `2`
}).apply(2);

プリミティブに関する詳細情報は次のとおりです:なぜ JavaScript プリミティブは instanceof Object ではないのですか?

于 2013-11-06T04:50:29.957 に答える
0

メソッドが非厳密モード コードの関数である場合、null および undefined はグローバル オブジェクトに置き換えられます。

つまり、ブラウザの場合はwindow、nodejsの場合は何を指しているのかわかりません。

プリミティブ値はボックス化されます

プリミティブ値は、対応するオブジェクトにラップされます。つまり、内部fn.apply(2, args)の変数の場合、値が 2 になる数値オブジェクトを参照します。thisfn

于 2013-11-06T04:53:16.123 に答える