gpt4 book ai didi

Javascript:为什么访问闭包变量可能很慢

转载 作者:搜寻专家 更新时间:2023-11-01 04:19:43 25 4
gpt4 key购买 nike

最近我读了这个performance guide Let's make the web faster并对“使用闭包避免陷阱”的建议感到困惑(好像这些建议是为 CommonLisp 用户提供的,其中变量范围是动态的):

var a = 'a';
function createFunctionWithClosure() {
var b = 'b';
return function () {
var c = 'c';
a;
b;
c;
};
}

var f = createFunctionWithClosure();
f();

when f is invoked, referencing a is slower than referencing b, which is slower than referencing c.

很明显,引用局部变量 cb 快,但如果正确编写 iterpreter(没有动态作用域 - 类似于链式哈希表查找......)速度差异应该只是微不足道的。还是不行?

最佳答案

你是对的。现代 JS 引擎将优化 scope chain lookupprototype chain lookup 。意思是,据我所知,引擎试图保存某种哈希表,下面有访问节点。

这仅在没有 eval()(显式或隐式,例如 setTimeout)或 try-catch 子句或 a with 语句 被调用。由于这样的构造,解释器无法确定如何访问数据,它需要“回退”到经典的作用域链查找,这实际上意味着,它必须遍历所有父上下文variable/activation objects 并尝试解析搜索到的变量名。当然,对于位于“远离”查找处理开始位置的对象/名称,此过程将花费更多时间。这反过来意味着,访问 global object 上的数据将始终是最慢的。

在您的代码段中,a 的查找过程会像这样

anonymous function -> Execution Context -> Activation Object (not found)
anonymous function -> Execution Context -> [[ Scope ]]
- createFunctionWithClosure
- global scope
createFunctionWithClosure -> Activation Object (not found)
global scope -> Variable Object (found)

所描述的查找过程适用于 ECMAscript Edition 262 第三版。 ECMAscript 第 5 版有一些根本性的变化。

关于Javascript:为什么访问闭包变量可能很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com