8

私のプラグインが任意の JS エンジン (ブラウザー内かどうかに関係なく) で実行できることを考えると、

  • window一部の変数が実際にブラウザオブジェクトであることをどのように知ることができますか。

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

  • また、オブジェクトを含む変数windowだけでなく、ブラウザオブジェクトが実際に存在するかどうかを確認する方法。window

    someVarが単独であるかどうかわからず、 のような実際のブラウザーオブジェクトwindowと照合したいとします。どのようにして、それがブラウザーであり、 という名前の外部スコープからの他のオブジェクトではないことを確認しますか?別の環境からグローバル?windowsomeVar === windowwindowwindowwindow

もう少し明確にするために:

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

スコープ外のどこかで宣言された別のオブジェクトである可能性があるif(!window)ため、次のようなことはできません。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()

//Stand-alone, I can assume window is global since "this" is the global in global space
(function(window){
  //window may not be window
}(this));

//But when this happens
someNamespace.someFunction = function(){

  (function(window){
    //window may not be window
  }(this));

}

//or this:
someNamespace.someFunction.call({});

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

4

6 に答える 6

4

これは、現在のウィンドウだけでなく、ウィンドウ全般をテストします。

    if (window.toString() === "[object Window]") {
         // your code here
    }

[編集]

toString()オブジェクト プロトタイプは JavaScript 初期バージョン 1.0 から利用可能で、「クラス」をチェックする昔ながらの方法でした。この質問に対する別の回答で言及されている方法と同様に、一意のオブジェクト プロパティを確認します。これは、文字列比較よりも実行が高速です。

JavaScript 1.4 (ECMAScript 3rd edition 1999) 以降instanceof、演算子を使用して、このタスクに適したメソッドであるオブジェクト Class をチェックできるようになりました。

    if (window instanceof Window) {
         // your code here
    }
于 2016-06-27T18:39:38.643 に答える
1

どうですか

function isWindow() {
    _test = 42;
    return window && window._test == 42
}
于 2013-07-09T08:32:23.287 に答える
1

インスタンスの作成を理解しているときに見つけました

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)

次のようなエラーを作成したかった

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

誰かが MyExampleInstance をインスタンスとしてではなく、次のような単純な関数として呼び出そうとした場合:

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

于 2017-11-30T16:13:48.623 に答える
0

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

(function(o){ 
 if(!!o.postMessage) console.log("This is my window"); 
 else console.log("This isn't my window");
})(window);  
于 2016-08-23T08:13:15.650 に答える
-1
if( this.window === this )

    

于 2013-07-09T08:12:05.710 に答える