Javascript:作用域链/变量查找性能
Javascript: Scope chain / Variable lookup performance
我看过几篇文章,解释了在Javascript中使用作用域链解析变量。
他们都说变量是在运行时解析的,沿着作用域链向上移动并迭代查找具有该名称的变量。我还看到了支持这一说法的图表,说明了链上变量的不良性能,访问时间在距离的范围级别数量上大致呈线性关系。
我不明白为什么访问时间不是恒定的。某个位置的变量名称创建恒定的词典绑定。所以我天真地想,我们应该能够表示相应的运行时变量引用实例,其中包含对执行上下文的引用以及对相对于该执行上下文的变量的引用。
你能解释一下为什么不是这样吗?
今天的 JIT 编译器(如 V8)可能会很好地优化其中的一些,但基本上这就是它的工作原理:
例如,拥有一堆这样的功能。
function foo() {
function bar() {
}
}
这将生成foo
的闭包和bar
的闭包。为了使变量查找正常工作,解释器必须向上浏览边界闭包才能找到变量。
例如,在bar
中,可以在
- 内部功能
bar
- 内部
foo
- 在全球范围内
上行距离,代码需要检查所有这些变量。
现在,您当然可以保留某种变量名称表,其中查找始终是恒定的,但是您会遇到另一个问题:阴影变量。
您可以共享嵌套函数中变量的相同名称。因此,这将在基于名称的变量查找表时出现问题。当然,您可能也可以根据可用的变量为每个函数复制和构建查找表,但这反过来又是速度与内存消耗的权衡。
如果不了解当今JS引擎的全部细节或实现,就很难说为什么它是这样设计的。但是,我认为这是一个足够合理的系统,因为它在不花费大量内存的情况下运行良好。此外,如果您希望加快变量查找速度,则始终可以将变量分配给函数的局部范围,因此您可以根据需要手动优化它。
相关文章:
- Javascript 变量使用 jquery 查找变量
- "可以't查找变量:cordova”;
- "可以't查找变量:window“;在suds.js中
- ReferenceError:Can't查找变量:functionName
- MongoDB MonkAPI根据数据库请求之外可用的查找结果设置变量
- 在 for 循环中查找变量的迭代总和
- 如果字符串保存在变量中,如何查找包含字符串的ID
- 敲除嵌套数组分页,如何跟踪变量或查找父记录
- 按名称查找变量
- ReferenceError:Can't在AngularJS中查找变量:xxxService,Karma
- JQuery可以't从单独的javascript文件中查找变量
- 查找任何未定义的变量并从url字符串中隐藏
- 代码在shell中运行,但提供'可以't查找变量'从文件运行时出错
- 在(跨浏览器)JavaScript 中,何时必须在局部范围内缓存变量查找
- Javascript:作用域链/变量查找性能
- 查找“包含”中的多个值变量
- 如何使用变量查找和更改对象属性
- 编码对象的Django模板变量查找
- 如何使用主JSON中的变量查找第二个JSON数据集-使用Handlebars
- 使用两个变量查找数组值