Javascript - 访问函数外部范围中的变量有多贵?

时间:2013-11-22 10:03:42

标签: javascript performance scope

我不太熟悉JavaScript的范围解析机制。 我想知道,JavaScript在范围链中访问一个或两个范围“向上”的变量有多贵? 假设我有一个名为scope3的函数,该函数位于名为scope2的函数内,该函数位于名为scope1的函数内。 如果我尝试从scope3访问scope1中定义的变量,JavaScript是否必须加载所有三个范围中的所有变量才能找到它?如果是这样,这种操作的昂贵程度取决于每个范围中定义了多少变量,是否正确?

出现了疑问,因为我有多个使用相同元素或值的函数。需要计算函数调用的值。 所以,我想知道检索元素并重新计算每个函数中的值是否更有效,避免攀升范围链,或者最好将函数包装在外部范围内,检索元素/计算值只有一次,然后只需从内部函数访问它们。 当然,这是我结构的简化示例。实际上我有多个范围级别。

这类案件的最佳做法是什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

我创建了一个小jsperf测试以获得一个想法。

    当没有闭合时,
  • v8(铬)超快,但闭合时速度慢很多。获得变量的距离有多远是不相关的。
  • Spidermonkey(firefox)速度较慢(铬最大速度的50%),但速度一致。

因此,作为第一个近似值,您可以认为闭包速度较慢。嵌套级别的数量虽然对速度没有影响。

答案 1 :(得分:-1)

您可以将变量作为参数传递(如果可能,在代码中),它并不昂贵而且更清晰。