2010-09-03 54 views
29

我有一个JavaScript处理检测页面是否在框架中。我用top.frames []等等,一切正常。自我和窗户有什么区别?

在这个脚本中,我注意到我可以互换地使用“窗口”或“自我”,并且所有东西都能正常工作。在HTML页面中使用时,“窗口”与“自我”相同吗?

+6

使用Web Workers时自己和窗口不是一回事。参见[http://stackoverflow.com/questions/11219775/global-variable-in-web-worker][1] [1]:http://stackoverflow.com/questions/11219775/global - 在网络工作者的变量 – user1872904 2014-06-02 13:45:17

回答

15

JavaScript权威指南

Window对象定义了一些 属性和允许你 操纵Web浏览器窗口的方法。 它还定义了指向其他重要对象的属性 ,例如 document属性为 Document对象。最后,窗口 对象具有两个自引用 属性,windowself。你可以使用全局变量 直接引用到Window对象,即 。

总之,windowself都是对Window对象的引用,它是客户端JavaScript的全局对象。

+0

除FF6.0之外的necro-bug,http://stackoverflow.com/a/7769187/139361,'window'和'self'应该是相同的。任何人都知道任何其他错误? --------------------------------------- 我必须补充说,使用'self'对大多数JavaScript开发人员来说都很混乱,所以使用'window'代替。 – Dan 2014-01-16 10:17:32

8

下面是the MDN page for window.self说明和示例:

if (window.parent.frames[0] != window.self) { 
    // this window is not the first frame in the list 
} 

window.self在比较过程几乎总是使用像在上面的例子中,其发现当前窗口是否是父框架集中的第一个子帧。

鉴于目前没有人使用框架集,我认为没有必要考虑self没有有用的情况。此外,至少在Firefox中,对window而不是window.self进行测试是等效的。

+0

对于需要独立于浏览器运行的代码,使用'self',即无头执行似乎更好。 – nilskp 2013-06-04 14:22:18

+0

@nilskp,这很有趣,但我不理解你。你能解释一下吗? – Dan 2014-01-13 09:37:38

+0

@Dan,'window'只存在于GUI(浏览器)中。并非所有的Javascript代码都在浏览器中运行。在这些情况下,'self'仍然可以工作,但'window'不会。 – nilskp 2014-01-13 21:15:34

6

self只读属性,可以比更灵活,并且有时支持,所述window直接使用。这是因为self的参考值根据操作环境而变化(与window.self不同,只有存在window时才存在)。正如其他人所说的那样,这也是比较好的选择。

例如,如果您在Web Worker(位于其自己的后台线程)内部使用selfself实际上会引用WorkerGlobalScope.self。但是,如果在正常的浏览器环境中使用self,则self只会返回对Window.self(具有document,addEventListener()以及您以前看过的所有其他内容)的引用。

TL; DR而在window.self.self不会,如果window不存在,存在于自己的意志点使用selfWindow.self在传统的窗口/浏览器上下文,或在网络工作者背景WorkerGlobalScope.self

像往常一样,MDN在这个问题上有一个很好的writeup in their JavaScript docs:)


旁注:var self = this切换后维持到上下文的引用:self这里的用法不应该与声明的局部变量的共同JS模式相混淆。

你可以在这里阅读更多关于:Getting Out of Binding Situations in JavaScript