Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用'的好处;窗口';javascript中的前缀_Javascript_Window_Namespaces - Fatal编程技术网

使用'的好处;窗口';javascript中的前缀

使用'的好处;窗口';javascript中的前缀,javascript,window,namespaces,Javascript,Window,Namespaces,在窗口对象中调用javascript变量或方法时,使用“窗口”前缀有什么好处吗?例如,调用“window.alert”会比简单地调用“alert”有优势吗? 我可以想象,当从某个函数/对象内部进行调用时,使用前缀可以稍微提高性能,但是我很少在人们的代码中看到这一点。从今往后,我怀疑是否有任何可以衡量的绩效效益。在所有范围链都将首先扫描标识符窗口,然后再扫描窗口对象以获得所需的项目。因此,它更有可能会破坏性能 如果作用域中有另一个变量将隐藏可能要从窗口检索的项,则使用窗口前缀非常有用。问题是你能一

在窗口对象中调用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();
    };
})();