0

Firefoxのjsengine/ gjs(spidermonkey)とwebkitのjscoreはどちらも、非オブジェクトで組み込みのjs関数と通常のjs関数を呼び出すときに動作が異なるようです。

gjs> toString.call(null)
"[object Null]"
gjs> function cccc() {return toString.call(this);}
gjs> cccc.call(null)
"[object GjsGlobal]"

したがって、通常のjs関数が非オブジェクトで呼び出された場合、それthisは自動的に現在の関数に置き換えられますがthis、これは組み込み関数では発生しません。

これは(いくつかの仕様による)標準の動作ですか、それとも単に実装に依存する動作ですか?最初の行は、値のタイプをチェックするために常に安全ですか?

THX

4

2 に答える 2

2

その動作は仕様によるものです。Mozillaのドキュメントに記載されているように:

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

どうやら、組み込み関数は厳密なモードコードとして扱われます。もちろん、厳密モード関数を作成しない限り、独自の関数はそうではありません。:-)

これはECMAScript5では異なります。仕様(PDF)から:

注thisArg値は、この 値として変更せずに渡されます。これはエディション3からの変更であり、未定義またはnull のthisArgがグローバルオブジェクトに置き換えられ、ToObject他のすべての値に適用され、その結果がthis値として渡されます。

これは、非規範的であるがHTMLバージョンの仕様へのより直接的なリンクです。

于 2012-06-05T09:18:43.143 に答える
1

詳細については、https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/callを参照してください。

これはECMAScript3rdEditionで定義されている標準の動作であり、はい、これは任意の値の型をチェックする方法であり、通常は配列をチェックするために使用されます。

于 2012-06-05T09:07:00.367 に答える