Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 为什么显式调用window对象的方法,性能会莫名其妙地降低_Javascript_Web - Fatal编程技术网

Javascript 为什么显式调用window对象的方法,性能会莫名其妙地降低

Javascript 为什么显式调用window对象的方法,性能会莫名其妙地降低,javascript,web,Javascript,Web,在web环境中,请考虑以下代码: window.alert('foo'); //code1 alert('foo'); //code2 为什么code2的性能高于code1?为什么会发生这种情况?首先,请记住,许多全局对象(包括所有传统的预定义全局对象)是全局对象的属性,而在浏览器上,全局对象是窗口对象窗口并不特殊,它只是一个引用全局对象的预定义全局对象警报也是预定义的全局警报 window.alert(…)比alert(…)慢,因为在window.alert(…)中,JavaS

在web环境中,请考虑以下代码:

window.alert('foo'); //code1
alert('foo');        //code2

为什么
code2
的性能高于
code1
?为什么会发生这种情况?

首先,请记住,许多全局对象(包括所有传统的预定义全局对象)是全局对象的属性,而在浏览器上,全局对象是窗口对象<代码>窗口并不特殊,它只是一个引用全局对象的预定义全局对象<代码>警报也是预定义的全局警报

window.alert(…)
alert(…)
慢,因为在
window.alert(…)
中,JavaScript引擎首先必须:

  • 查找标识符
    窗口
    ,它最终会将其作为全局对象的属性找到,然后
  • 在该对象的属性中查找
    alert
    ,然后
  • 调用它找到的函数
  • 警报(…)
    中,它只需:

  • 查找标识符
    警报
    ,它最终会将其作为全局对象的属性找到,然后
  • 调用它找到的函数
  • 因此,它不需要寻找两件事,而只需要寻找一件

    更少的工作=更快的性能


    话虽如此,有两项意见:

  • 显示
    警报的速度通常并不重要。:-)<代码>警报
    毕竟会占用JavaScript引擎,直到用户将其关闭

  • 即使有些东西不会占用JavaScript引擎,在大多数情况下,
    window.xyz(…)
    xyz(…)
    之间的差异也会很小。通常,您会因为其他原因看到
    window.xyz(…)
    (例如,当您想要访问全局范围时,某些其他
    xyz
    在范围内)。(我并不是说它们是好的理由;通常你可以避免这样做,当然,不管怎样,只要有可能,人们都会尽量避免全球性的。)

  • 如果调用全局函数的性能很重要(根据定义,这意味着您将其称为),您可能无论如何都不想使用全局引用;在内部作用域中获取对它的本地引用(
    var f=theGlobalFunction;
    ),然后使用
    f()
    重复调用它。这避免了对全局对象的词汇环境遍历和查找。再说一次:只在非常罕见的情况下才有意义;除非您发现了一个可观察到的性能问题并将其缩小到全局函数调用,否则不要这样做。:-)


  • 第一次查找(全局)的时间取决于代码嵌套的深度(以及在到达全局对象之前需要搜索多少词汇环境对象)和全局对象具有多少属性。第二部分,查找属性,仅依赖于第二部分。大量的全局变量(例如,如果在许多元素上使用
    id
    s,因为这些变量被添加为自动全局变量,则会创建全局变量)可以降低全局查找时间。

    首先,请记住,许多全局变量(包括所有传统的预定义全局变量)都是全局对象的属性,在浏览器上,全局对象是窗口对象<代码>窗口并不特殊,它只是一个引用全局对象的预定义全局对象<代码>警报也是预定义的全局警报

    window.alert(…)
    alert(…)
    慢,因为在
    window.alert(…)
    中,JavaScript引擎首先必须:

  • 查找标识符
    窗口
    ,它最终会将其作为全局对象的属性找到,然后
  • 在该对象的属性中查找
    alert
    ,然后
  • 调用它找到的函数
  • 警报(…)
    中,它只需:

  • 查找标识符
    警报
    ,它最终会将其作为全局对象的属性找到,然后
  • 调用它找到的函数
  • 因此,它不需要寻找两件事,而只需要寻找一件

    更少的工作=更快的性能


    话虽如此,有两项意见:

  • 显示
    警报的速度通常并不重要。:-)<代码>警报
    毕竟会占用JavaScript引擎,直到用户将其关闭

  • 即使有些东西不会占用JavaScript引擎,在大多数情况下,
    window.xyz(…)
    xyz(…)
    之间的差异也会很小。通常,您会因为其他原因看到
    window.xyz(…)
    (例如,当您想要访问全局范围时,某些其他
    xyz
    在范围内)。(我并不是说它们是好的理由;通常你可以避免这样做,当然,不管怎样,只要有可能,人们都会尽量避免全球性的。)

  • 如果调用全局函数的性能很重要(根据定义,这意味着您将其称为),您可能无论如何都不想使用全局引用;在内部作用域中获取对它的本地引用(
    var f=theGlobalFunction;
    ),然后使用
    f()
    重复调用它。这避免了对全局对象的词汇环境遍历和查找。再说一次:只在非常罕见的情况下才有意义;除非您发现了一个可观察到的性能问题并将其缩小到全局函数调用,否则不要这样做。:-)

  • 第一次查找(全局)的时间取决于代码嵌套的深度(以及在到达全局对象之前需要搜索多少词汇环境对象)和全局对象具有多少属性。第二部分,查找属性,仅依赖于第二部分。一个真正可怕的巨大的球体(例如,如果你在很多地方使用
    id
    s,就会产生)