6

関数がオブジェクトにアタッチされて呼び出されると、次のようになります。

function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20

this関数がメソッドとして呼び出されたオブジェクトを参照します。するのと同じf.call(o)です。

関数がオブジェクトの一部として呼び出されない場合this、グローバル オブジェクトを参照します。関数が非オブジェクト コンテキストから呼び出されているかどうかを確認するにはどうすればよいですか? グローバル オブジェクトにアクセスするための標準的なキーワードはありますか? このようなことをする唯一の方法はありますか?

globalobj = this;
function f() { if (this == globalobj) doSomething(); }

注: ここでは特定の使用例を念頭に置いているわけではありません。実際には、この正確なメカニズムについて質問しています。

4

3 に答える 3

10

null の値で Function.call を使用するとグローバルスコープで呼び出されるため、以下は機能するはずです。

this === ((function () { return this; }).call(null))

より単純な変種、

this === (function () { return this; })()

も機能しますが、最初の方が意図がより明確になると思います。

于 2008-12-22T01:18:53.733 に答える
8

グローバルオブジェクトは実際にはウィンドウであるため、次のことができます

if (this === window)
于 2008-12-20T10:49:41.820 に答える
1

RoBorgの答えは概念的に正しいです-ただしwindow、ブラウザーのメインスレッドのコンテキストでのみ使用可能です(したがって、これは必然的にワーカースレッドなど、およびブラウザーでホストされていないJSを除外します。

最も安全な賭けは基本的に上記のものですが、インタプリタがそのようなアクセスをより完全に最適化することが可能であるため、使用する必要がvarあります。===

于 2008-12-21T08:25:17.010 に答える