Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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_Performance - Fatal编程技术网

JavaScript中的变量有多昂贵?

JavaScript中的变量有多昂贵?,javascript,performance,Javascript,Performance,JavaScript中的局部变量(var v)、全局变量(window.v)和跨全局变量(parent.v)在主要浏览器中的开销有多大?有没有人在这方面进行过良好的测试?忽略解释器/解析器的优点和缺点,重要的是运行时必须在多大程度上查看作用域链的各个部分 考虑这个简单的例子: foo = 42; // implicitly window.foo; cost: 2 var bar = 3; // cost: 1 function woot(a) { a;

JavaScript中的局部变量(
var v
)、全局变量(
window.v
)和跨全局变量(
parent.v
)在主要浏览器中的开销有多大?有没有人在这方面进行过良好的测试?

忽略解释器/解析器的优点和缺点,重要的是运行时必须在多大程度上查看作用域链的各个部分

考虑这个简单的例子:

foo = 42;         // implicitly window.foo; cost: 2
var bar = 3;      // cost: 1

function woot(a) {
    a;            // cost: 1
    bar;          // cost: 2
    foo;          // cost: 3

    var other = 9;// cost: 1

    other;        // cost: 1

    a.something;  // cost: 2
    foo.win.fail.arg.func(a.something).thing = 0; // cost: 8 + 2
}

woot(bar);        // cost: 2 + 1
请记住,函数与变量(我认为)共享相同的名称空间,并且在解析方面与变量类似


使用
foo['bar']
而不是
foo.bar
没有额外的成本,除了可能通过Javscript引擎进行的优化(尽管如果要优化后者,如果内容是文字,则应该很容易优化前者)。

局部变量对象上始终存在局部范围的变量,“自由”也将如此

要在作用域中访问全局变量,必须遍历作用域链,直到到达全局对象,在[[global]]变量对象上可以找到全局变量。这里的成本取决于链中作用域的数量

在不同的窗口中访问变量时,情况就不同了。
大多数较新的浏览器都使用自己的线程和堆栈隔离每个窗口,以提高稳定性,改进垃圾收集,并避免一个窗口线程使整个浏览器崩溃。
对于变量访问来说,这意味着一个窗口中的变量不能被另一个窗口(在不同的堆栈上)直接访问。那么这是如何解决的呢

以Opera为例,一旦一个窗口尝试访问另一个窗口变量,Opera实际上会暂停执行,将两个堆栈和执行环境合并在一起,然后继续执行。

我想你可能会说这很贵:)

在什么方面贵?演出记忆?另外,变量包含什么?我敢肯定,一个包含单个整数的变量并不昂贵,但一个包含大数组的变量更昂贵……诅咒这个变量!我想我得重新使用一些变量来省钱…该死。不是三个fiddy@codeka:是的,就性能、内存和其他方面而言。函数在这个意义上被视为变量-它们都被添加到为作用域创建的变量对象中。@Sean Kisney,感谢您的澄清。我知道Javascript的基本工作原理,但我没有读过ECMAScript规范或其他任何东西。这不是我所希望的答案,但很有见地,我从未真正意识到全局变量的成本大约是局部变量的三倍。正如您所说,解析器可能也应该是无关紧要的,因为它们现在每月都在改进。@Tom,如果您有越来越多的作用域(例如,函数中的函数),那么全局解析器的成本将进一步增加,因为它在作用域链上的作用域越来越远。(很多jQuery代码中都有很多作用域)在网页中从不考虑“IPC”;好主意。