8

鉴于我的插件可以在任何 JS 引擎上运行(无论是否在浏览器中),

  • 怎么知道某个变量实际上是浏览器window对象。

    就像我怎么知道是否someVar引用了浏览器window对象。有什么window我可以检查它是否真的是浏览器window对象吗?

  • 以及如何检查浏览器window对象是否确实存在,而不仅仅是window包含对象的某个变量。

    假设您无法判断它是否someVar单独window存在,并且您想将其与真实的浏览器window对象(例如)进行匹配,您someVar === window如何window确定它是浏览器,window而不是来自名为window来自另一个环境的全局?

只是为了澄清一点:

  • 我不是在寻找环境的全局。我正在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运算符来检查对象类,这是该任务的正确方法。

    if (window instanceof Window) {
         // your code here
    }
于 2016-06-27T18:39:38.643 回答
3

你可以像这样得到全局对象......

var global = (1,eval)("this");
于 2013-07-09T08:14:05.170 回答
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 回答