使用'的好处;窗口';javascript中的前缀
在窗口对象中调用javascript变量或方法时,使用“窗口”前缀有什么好处吗?例如,调用“window.alert”会比简单地调用“alert”有优势吗?使用'的好处;窗口';javascript中的前缀,javascript,window,namespaces,Javascript,Window,Namespaces,在窗口对象中调用javascript变量或方法时,使用“窗口”前缀有什么好处吗?例如,调用“window.alert”会比简单地调用“alert”有优势吗? 我可以想象,当从某个函数/对象内部进行调用时,使用前缀可以稍微提高性能,但是我很少在人们的代码中看到这一点。从今往后,我怀疑是否有任何可以衡量的绩效效益。在所有范围链都将首先扫描标识符窗口,然后再扫描窗口对象以获得所需的项目。因此,它更有可能会破坏性能 如果作用域中有另一个变量将隐藏可能要从窗口检索的项,则使用窗口前缀非常有用。问题是你能一
我可以想象,当从某个函数/对象内部进行调用时,使用前缀可以稍微提高性能,但是我很少在人们的代码中看到这一点。从今往后,我怀疑是否有任何可以衡量的绩效效益。在所有范围链都将首先扫描标识符
窗口
,然后再扫描窗口对象以获得所需的项目。因此,它更有可能会破坏性能
如果作用域中有另一个变量将隐藏可能要从窗口检索的项,则使用窗口前缀非常有用。问题是你能一直知道这可能是什么时候吗?答案是否定的。那么您是否应该始终以window作为前缀?如果这样做,代码会是什么样子。丑陋的。因此,除非您知道需要,否则不要这样做。我想,如果真有这样的好处,那么这里的性能好处充其量也是微不足道的。只有在使用帧并跨帧执行大量javascript调用时,这才有关系,即使这样,也只有特定的场景才能保证显式引用
窗口的必要性。当您使用前缀时,您是在显式地使用变量的“全局”定义,而不是局部定义。(我不确定是否/如何将变量注入JS中的作用域,除了这个和内联事件处理程序的奇怪之处。)YMMV,您可能更喜欢清晰,或者发现它只是杂乱无章。从Google()检索:
窗口对象是对象层次结构的顶级对象。因此,每当在没有对象名称和点前缀的脚本中引用对象方法或属性时,JavaScript都假定该对象方法或属性是窗口对象的成员。这意味着,例如,当调用window alert()方法以显示警报对话框时,窗口将关闭。前缀不是必需的。因此,以下方法调用实现了相同的功能:
window.alert()
警报()
但是,我阅读了,但没有时间测试以下内容:
()
不过,您需要注意的一个地方是事件处理程序。由于事件处理程序绑定到文档,因此与窗口属性(例如open)同名的文档属性将屏蔽窗口属性。因此,在事件处理程序中寻址窗口属性时,应始终使用完整的“窗口”语法
这在尝试测试全局对象值时非常有用。例如,如果未定义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(globalValue=='something')/就性能而言,我认为AnthonyWJones已经涵盖了它
窗口前缀的一个用途是显式地使当前范围之外的内容可用。如果您在自调用函数中编写代码以避免污染全局范围,但是您确实希望在其中提供全局可用性,那么您可以执行以下操作:
(function(){
function foo(){
//not globally available
}
function bar(){
//not globally available
}
window.baz = function(){
//is globally available
foo();
bar();
};
})();
警报是一个糟糕的例子,因为它通常只被调用一次,并且(通常)显示它所需的时间并不重要。我不知道范围链会被扫描为窗口!我一直认为窗口是一个保留的关键字,因此它不会发生。谢谢。范围链实际上是反过来工作的。局部变量覆盖全局变量。baz=function(){/*…*/}
也会覆盖全局变量,不,AnthonyWJones没有覆盖它。由于作用域的工作方式,该标准保证了可测量的性能优势(不仅在JS中,而且在Lua等语言中)。
(function(){
function foo(){
//not globally available
}
function bar(){
//not globally available
}
window.baz = function(){
//is globally available
foo();
bar();
};
})();