Javascript 检查是否为';窗口对象是什么

Javascript 检查是否为';窗口对象是什么,javascript,Javascript,考虑到我的插件可以在任何JS引擎上运行(无论是否在浏览器中) 如何知道某个变量实际上是浏览器窗口对象 例如,我如何知道someVar是否引用了浏览器窗口对象。窗口中是否有我可以检查它是否真的是浏览器窗口对象的东西 以及如何检查浏览器窗口对象是否确实存在,而不仅仅是包含对象的某个窗口变量 假设您无法判断someVar本身是否是window,并且希望将其与真正的浏览器window对象(如someVar==window)相匹配,如何使窗口确信它是浏览器窗口,而不是来自名为窗口的外部范围的其他对象,或

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

  • 如何知道某个变量实际上是浏览器
    窗口
    对象

    例如,我如何知道
    someVar
    是否引用了浏览器
    窗口
    对象。
    窗口
    中是否有我可以检查它是否真的是浏览器
    窗口
    对象的东西

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

    假设您无法判断
    someVar
    本身是否是
    window
    ,并且希望将其与真正的浏览器
    window
    对象(如
    someVar==window
    )相匹配,如何使
    窗口
    确信它是浏览器
    窗口
    ,而不是来自名为
    窗口
    的外部范围的其他对象,或来自其他环境的其他全局对象

再澄清一下:

  • 我不是在寻找全球的环境问题。我正在寻找浏览器
    窗口
    对象
  • 我没有检查脚本是否在浏览器上运行
我无法执行类似于
if(!window)
的操作,因为
window
可能只是在范围之外的某个地方声明的另一个对象

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

  (function(){
    console.log(window); //{foo:'bar'}
  }());
}
我无法检查
是否(window.window===window)
,因为我也可以进行自引用,正如前面所说,
window
可以是外部范围中的对象:

var bar = {};
bar.bar = bar;
bar.bar.bar.bar.bar.bar === bar; //true
由于脚本可能被包装或连接到全局空间之外的其他内容中,因此以下操作可能不起作用
也可以通过调用来修改,如
call()
apply()
bind()

我有一种感觉,这是一个复制品,但我找不到我第一次看到它的地方

if( this.window === this )

您可以像这样获得全局对象

var global = (1,eval)("this");
怎么样

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

这将不仅测试当前窗口,而且测试一般窗口:

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

[编辑]

toString()
对象原型可从JavaScript初始版本1.0获得,是检查“类”的老式方法。以及这个问题的另一个答案中提到的方法——检查惟一对象属性,它比字符串比较执行得更快

自从JavaScript 1.4(ECMAScript第3版1999)以来,我们能够利用
instanceof
操作符来检查对象类,这是执行此任务的正确方法

    if (window instanceof Window) {
         // your code here
    }

如果使用对象窗口仅支持的某些方法,则可以检查它。 例如postMessage:

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

我在理解如何通过创建实例时发现了它

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

可能的重复听起来像是您想通过检查窗口是否存在来确定代码是否在浏览器中运行。您可以尝试查找浏览器可能作为窗口的一部分实现的功能,例如window.location.href,但当然,即使这样也不是故障安全的。如何确定是否可以返回有效的userAgent字符串?调用(null)是否始终有效?@JanDvorak:Nope。在ES3环境中可能会这样,但ES5更改了规则,即当显式传递
null
时,
thisArg
不会更改为全局对象。例如,这将返回null:
(函数(){“使用严格”;返回(函数(){return this})。调用(null);})(
@AndyE何时更改为
thisArg
?可以使用类似的方法吗?“脚本可以包装在全局空间以外的其他地方”,然后在文件顶部保存对
this
的引用。天哪,“脚本”指的是整个文件,我猜。不必粗鲁。在这种情况下,我恐怕询问者的脚本不是文件。或者可能是某个地方包含的文件。或者,它可能是一个“所有文件都在全局上下文中执行”不适用的环境。或者可能是一个不存在文件概念的环境。有很多环境,你不能仅仅假设提问者可以在脚本本身之外的任何地方放置任何东西,而且“脚本可以包装在全局空间之外的其他地方”。我以前工作过的一家公司的经理非常喜欢可配置的东西,他希望事情尽快完成。当然,为数据库访问编码要比为文件访问编码快。事实证明,javascript并不总是存储在文件中,而且它也不总是被注入全局范围。当然,不这样做是有原因的,但是管理员的PHP注入和Javascript注入要比花一个小时编写代码要好。有时候,这些脚本不在全局范围内,但是,比如说,一个jQuery
点击处理程序。没有
eval
(或者
newfunction
)有可能吗?@JanDvorak:我很确定没有。我不能与
1
字符分开。实际上,我们在
“this”
字符串上运行
eval
1
是如何涉及到这里的?@tommi这只是一种间接调用eval()的方法。1不相关(它可以是任何有效的表达式),重要的是不要直接调用eval()。这就是您可以在任何地方对全局范围内的代码求值的方式。但它在IE8及更低版本中不起作用。除非您应该测试
\u test
是否在
窗口中不存在,如果存在,请使用其他值进行测试。此外,在完成测试后不要忘记回滚;-)@詹德沃夏克:是的,但是如果没有窗户,我怎么滚b
// 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