2013-07-09 3 views
5

チェックし、それは、私のプラグインは(ブラウザやない)任意のJSエンジン上で実行することができることを考えると、ウィンドウオブジェクト

  • 場合はどのようにして、いくつかの変数が実際にブラウザwindow対象であることを知っているん。

    どうすればsomeVarがブラウザwindowオブジェクトを参照しているかどうかを知ることができます。 windowに、実際にブラウザであるかどうか確認できるものがありますかwindowオブジェクトですか?

  • そして、windowというオブジェクトが実際に存在する変数ではなく、ブラウザwindowオブジェクトが実際に存在するかどうかをチェックする方法。

    あなたはsomeVarは、それ自体でwindowあり、そしてあなたがsomeVar === windowのような本当ブラウザwindowオブジェクトに対してそれを一致させたい場合は、どのようにあなたはそれがブラウザwindowとしていないことを確認しているwindowを得るのですか言うことができないと仮定します外部スコープのwindowという名前の他のオブジェクト、または別の環境の別​​のグローバルオブジェクトがありますか?

ただ、もう少し明確にする:

  • 私は環境のグローバルを探していませんよ。私は特にブラウザwindowオブジェクトを探しています。
  • スクリプトがブラウザで実行されているかどうかは確認していません。

windowはスコープ外のどこかで宣言されている可能性がありますので、if(!window)のようなことはできません。

function someFunction(){ 
    var window = {foo:'bar'}; 

    (function(){ 
    console.log(window); //{foo:'bar'} 
    }()); 
} 

私も自己参照を行うことができますので、私はif(window.window === window)を確認することができない、などは以前、windowは外側のスコープからオブジェクトである可能性があるという。

var bar = {}; 
bar.bar = bar; 
bar.bar.bar.bar.bar.bar === bar; //true 

そしてので、動作しないことがあり、次のスクリプトはグローバル・スペース以外のものでラップまたは連結される可能性があります。 thisは、call(),apply()またはbind()のような呼び出しでも変更できます。

​​

これは重複していると感じていますが、最初に見た場所が見つかりませんでした。

+0

可能重複して見られる最も簡単な方法の目的であります[node.jsでスクリプトが実行されているかどうかを確認する方法](http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –

+0

あなたがしたいように聞こえるウィンドウが存在するかどうかをチェックして、コードがブラウザで実行されているかどうかを判断します。ブラウザがwindow.location.hrefのようなウィンドウの一部として実装できる機能を探してみることもできますが、もちろんこれはフェールセーフではありません。有効なuserAgent文字列を返すことができるかどうかを判断する方法はありますか? – series0ne

+0

'(function(){return this})' call(null) 'は常に動作しますか? –

答えて

-1
if(this.window === this) 

       

+0

"スクリプトはグローバルスペース以外のものにラップすることができます" –

+0

ファイルの先頭に 'this'への参照を保存します。イエス。 –

+0

"スクリプト"はファイル全体を指しています。無礼にする必要はありません。 –

3

あなたはそうのようなグローバルオブジェクトを取得することができます...

var global = (1,eval)("this"); 
+0

'eval'(または' new Function')なしで可能ですか? –

+0

@JanDvorak:私はそれがないと確信しています。 –

+1

私は '1'文字で参加できません。実際に '' this ''文字列に対して' eval'を実行します。どのように '1 'がここに関わっていますか? – Tommi

1

どう

function isWindow() { 
    _test = 42; 
    return window && window._test == 42 
} 
+0

'_test'が' window'にまだ存在していないかどうかをテストし、そうであれば他の値でテストしなければなりません。 –

+0

また、テストを終了した後にテストをロールバックすることを忘れないでください; –

+0

@JanDvorak:はい、ウィンドウは表示されません。どのようにロールバックしますか? – georg

2

現在のウィンドウのためのこの意志だけではないテストが、一般的にウィンドウの程度:

window.toString() == "[object Window]"; 
0

あなただけでサポートされているいくつかのメソッドを使用する場合は、それを確認することができますオブジェクトウィンドウ は、たとえばのpostMessage:

var MyExampleInstace = function MyExampleInstace() { 
    console.log(this); // returns undefined in strict mode 
    // in not strict mode it will return Window 
} 

new MyExampleInstace(); // will not return and error (this will be fine) 

を通じて作成インスタンスを理解しながら

(function(o){ 
if(!!o.postMessage) console.log("This is my window"); 
else console.log("This isn't my window"); 
})(window); 
0

は私が誰かではないインスタンスとしてMyExampleInstanceを呼び出そうとすると、私は

throw new Error('Please use "new" keyword'); 

のようなエラーを作成したいことを見つけました次のような単純な関数として:

MyExampleInstance(); // console should show "Please use "new" keyword 

だから、最終的な結果は次の通りであった:

var MyExampleInstace = function MyExampleInstace() { 
    if (this === undefined || this instanceof Window) throw new Error('Please use "new" keyword'); 
} 

オブジェクトを確認するには、いくつかの「種類」私はの

// myVar could be "this" or every var u need 
// That's also opens the way to check the object instance of your MyExampleInstance 
myVar instanceof Window 

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/instanceof

関連する問題

 関連する問題