在主流浏览器中,JavaScript中的局部变量(var v
),全局变量(window.v
)和跨全局变量(parent.v
)有多贵?有没有人对这个进行过任何好的测试?
答案 0 :(得分:8)
忽略解释器/解析器的优点和缺点,重要的是运行时必须查看作用域链的各个部分。
考虑这个简单的例子:
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引擎进行优化(尽管如果你优化后者,如果内容优化前者应该很容易是文字的。)
答案 1 :(得分:2)
本地范围的变量将始终存在于本地变量对象上,因此将是“免费”的。
要在范围内到达全局变量,您必须遍历范围链,直到到达全局对象,然后在[[global]]变量对象上找到它。这里的成本取决于链中的范围数量。
当涉及到在不同窗口中访问变量时,现在这是一个不同的故事
大多数较新的浏览器将每个窗口与自己的线程和自己的堆栈隔离开来,以提高稳定性,改善垃圾收集,并避免一个窗口线程崩溃整个浏览器。
这对于变量访问意味着一个窗口中的变量不能直接访问另一个窗口(在不同的堆栈上)。那怎么解决了?
以Opera为例,一旦一个窗口试图访问另一个窗口变量,Opera实际上会暂停执行,将两个堆栈和执行环境合并在一起,然后继续执行。
我想你可能会说这相当昂贵:)