在javascript中使用'window'前缀的好处

Pro*_*one 8 javascript namespaces window

在窗口对象中调用javascript变量或方法时,使用'window'前缀有什么好处吗?例如,调用'window.alert'比简单地调用'alert'更有优势吗?我可以想象使用前缀可以在从某个函数/对象内部调用时提供小的性能提升,但是我很少在人们的代码中看到这一点.此后这个问题.

Pre*_*aul 9

这在尝试测试全局对象值时很有用.例如,如果GlobalObject未定义,则会抛出错误:

if(GlobalObject) { // <- error on this line if not defined
    var obj = new GlobalObject();
}
Run Code Online (Sandbox Code Playgroud)

但这不会引发错误:

if(window.GlobalObject) { // Yay! No error!
    var obj = new GlobalObject();
}
Run Code Online (Sandbox Code Playgroud)

与:相似

if(globalValue == 'something') // <- error on this line if not defined
if(window.globalValue == 'something') // Hurrah!
Run Code Online (Sandbox Code Playgroud)

和:

if(globalObj instanceof SomeObject) // <- error on this line if not defined
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW!
Run Code Online (Sandbox Code Playgroud)

我不希望看到显着的性能差异,并且您可能执行此操作的唯一其他原因是确保您实际从全局范围获取值(如果值已在当前范围中重新定义).


Ant*_*nes 7

我怀疑是否有任何可衡量的性能优势.在首先扫描所有范围链的标识符window之后,将扫描窗口对象以寻找所需的项目.因此,更有可能是性能恶化.

如果在作用域中有另一个隐藏您可能想要从窗口中检索的项目的变量,则使用窗口前缀非常有用.问题是,你可以随时知道这可能是什么时候?答案是不.所以你应该总是用窗口作为前缀吗?如果你这样做,你会看起来像什么?丑陋.因此,除非你知道你需要,否则不要这样做.


Din*_*rer 5

从谷歌检索(http://www.techotopia.com/index.php/JavaScript_Window_Object):

window 对象是对象层次结构的顶级对象。因此,只要在脚本中引用对象方法或属性而没有对象名称和点前缀,JavaScript 就会假定它是 window 对象的成员。这意味着,例如,当调用 window alert() 方法来显示一个警告对话框时,window. 前缀不是强制性的。因此,以下方法调用实现了相同的目的:

window.alert()
警报()

但是,我阅读但没有时间测试以下内容:(http://www.javascriptref.com/reference/object.cfm?key=20)

但是,您需要小心的一个地方是在事件处理程序中。由于事件处理程序绑定到 Document,与 Window 属性同名的 Document 属性(例如,open)将屏蔽 Window 属性。因此,您应该始终使用完整的“窗口”。处理事件处理程序中的 Window 属性时的语法。