2

ジョン・レシグは次のように書いています。

最後に、長年の (そして非常に厄介な) バグが解決されました: null または undefined が強制的にグローバル オブジェクトになるケース。厳密モードでは、これが発生するのを防ぎ、代わりに例外をスローするようになりました。

(function(){ ... }).call( null ); // Exception

彼が言及しているバグは何ですか?

4

1 に答える 1

2

基本的に、call()メソッド fromを使用してFunction.prototypeいます。これは、デフォルトでスコープを最初のパラメーターとして受け取ります。実行スコープがundefinedまたはnullの場合、デフォルトでグローバル オブジェクトになります。場合によっては、callメソッドを即時呼び出し関数式 (上記のコードはかなり一般的ではありません) で使用すると、デフォルトのフォールバック実行スコープとしてグローバル オブジェクトが使用されません。

これが厳密モード コード内で評価される場合、this値はオブジェクトに強制されません。またはのthis値はグローバル オブジェクトに変換されず、プリミティブ値はラッパー オブジェクトに変換されません。関数呼び出し ( and を使用して行われた呼び出しを含む) を介して渡された this 値は、渡された値を(ECMA 言語仕様の 10.4.3、11.1.1、15.3.4.3、15.3.4.4 句) に強制しません。nullundefinedFunction.prototype.applyFunction.prototype.callthisObject

于 2012-12-21T21:16:08.880 に答える