7

なぜ次のように機能するのですか?

function sum(a,b) { return a + b; }
var result = sum.call(null,3,4);     // 7

結果が定義されるのはなぜですか?nullの方法としてsumを呼び出しています。ただし、nullはオブジェクトではなく、プロパティを持つことはできません。

何が起こっている?

4

5 に答える 5

17

の最初の引数Function.prototype.callcontextthisです。これは、呼び出された関数の実行コンテキストの値を定義します。それ以外は何もありません。

つまり、基本的には(少なくとも、ES5 strictモードでは)this参照していると言っていますが、とにかくアクセスしないので、違いはありません。nullthis

非厳密モードでは、thisはできません。そのため、代わりにグローバルオブジェクトnullに置き換えられます。

于 2012-07-25T21:49:16.203 に答える
12

.callor .applywith nullorを使用すると、厳密モードでない場合は、代わりにundefinedデフォルトthis(通常は)が自動的に使用されます。window

MDN(強調鉱山)から:

thisArg
thisの呼び出しに提供される の値fun。これは、メソッドで見られる実際の値ではない可能性があることに注意してください。メソッドが非厳密モードコードの関数でnullありundefined、グローバルオブジェクトに置き換えられ、プリミティブ値がボックス化される場合。

厳密モードの場合、実際にはまたはnullになりますundefined

(function() {
    'use strict';

    return this;
}).call(null); // null
(function() {
    'use strict';

    return this;
})(); // undefined
于 2012-07-25T21:49:03.153 に答える
4

そうではありません。この場合のNULLは、thisキーワードがどのオブジェクトにバインドされるかを指定します。メソッドでは、NULLに設定することにより、this変数バインディングがないか、関数自体またはウィンドウにバインドされます。

を介してアクセスされる変数や関数を使用していthisないため、呼び出しメソッドを使用する必要はありません...使用するだけです。sum(3,4)

于 2012-07-25T21:49:43.423 に答える
1

たとえば、MDNで述べられているように、最初の引数は

この値は、[メソッド]の呼び出しに提供されます。これはメソッドから見た実際の値ではない可能性があることに注意してください。メソッドが非厳密モードコードの関数である場合、nullおよびundefinedはグローバルオブジェクトに置き換えられ、プリミティブ値はボックス化されます。

于 2012-07-25T21:52:31.950 に答える
0

MDNが説明したように。

thisArg

これの価値は、楽しみへの呼びかけに提供されました。これはメソッドで見られる実際の値ではない可能性があることに注意してください。メソッドが非厳密モードコードの関数である場合、nullおよびundefinedはグローバルオブジェクトに置き換えられ、プリミティブ値はボックス化されます。

簡単なコードでそれを置くだけです。

<script >
        'use strict'
        function fun() {
            alert(this);
        }
        fun.call(null);

    </script>

厳密モードでは、これはnullです。ただし、厳密ではないモードでは。これはウィンドウまたはグローバルオブジェクトです。

于 2014-05-23T06:56:24.103 に答える