在窗口对象中调用javascript变量或方法时,使用'window'前缀有什么好处吗?例如,调用'window.alert'比简单地调用'alert'更有优势吗? 我可以想象使用前缀可以在从某个函数/对象内部调用时提供小的性能提升,但是我很少在人们的代码中看到这一点。此后这个问题。
答案 0 :(得分:9)
这在尝试测试全局对象值时很有用。例如,如果未定义GlobalObject
,则会引发错误:
if(GlobalObject) { // <- error on this line if not defined
var obj = new GlobalObject();
}
但这不会引发错误:
if(window.GlobalObject) { // Yay! No error!
var obj = new GlobalObject();
}
与:相似:
if(globalValue == 'something') // <- error on this line if not defined
if(window.globalValue == 'something') // Hurrah!
和
if(globalObj instanceof SomeObject) // <- error on this line if not defined
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW!
我不希望看到显着的性能差异,并且您可能执行此操作的唯一其他原因是确保您实际从全局范围获取值(如果在当前范围中重新定义了值)
答案 1 :(得分:7)
我怀疑是否有任何可衡量的性能优势。在首先扫描所有范围链的标识符window
之后,将扫描窗口对象以寻找所需的项目。因此,更有可能是性能恶化。
如果在作用域中有另一个隐藏您可能想要从窗口中检索的项目的变量,则使用窗口前缀非常有用。问题是,你可以随时知道这可能是什么时候?答案是不。那么你应该总是用窗口作为前缀吗?如果你这样做,你会看起来像什么?丑陋。因此,除非你知道你需要,否则不要这样做。
答案 2 :(得分:4)
取自Google(http://www.techotopia.com/index.php/JavaScript_Window_Object):
窗口对象是对象层次结构的顶级对象。因此,每当在没有对象名称和点前缀的脚本中引用对象方法或属性时,JavaScript就会假定它是窗口对象的成员。这意味着,例如,当调用窗口alert()方法时,在窗口中显示警告对话框。前缀不是强制性的。因此,以下方法调用实现相同的目的:
window.alert()
警报()
但是,我读过但没有时间测试以下内容:
(http://www.javascriptref.com/reference/object.cfm?key=20)
但是,您需要注意的一个地方是事件处理程序。由于事件处理程序绑定到Document,因此与Window属性同名的Document属性(例如,open)将屏蔽Window属性。因此,您应该始终使用完整的“窗口”。在事件处理程序中寻址Window属性时的语法。
答案 3 :(得分:1)
就性能而言,我认为AnthonyWJones已经覆盖了它。
窗口前缀的一个用途是在当前范围之外明确地使某些东西可用。如果您在自我调用函数中编写代码以避免污染全局范围,但是您确实想要使全局可用,那么您可能会执行以下操作:
(function(){
function foo(){
//not globally available
}
function bar(){
//not globally available
}
window.baz = function(){
//is globally available
foo();
bar();
};
})();
答案 4 :(得分:0)
我认为,如果有一个,那么这里的性能优势至多是微不足道的。
答案 5 :(得分:0)
只有你在帧中使用帧并进行一堆javascript调用才有意义,即使这样,只有特定场景才能保证必须明确引用window
。
答案 6 :(得分:0)
当你使用前缀时,你明确表示你正在使用变量的“全局”定义,而不是本地定义。 (我不确定是否/如何将变量注入JS中的范围,除了使用此内联事件处理程序的奇怪之处。)YMMV,您可能更喜欢清晰度,或者发现它只是杂乱无章。