【问题标题】:Javascript - how expensive is it to access variables in a function's outer scope?Javascript - 访问函数外部范围内的变量有多昂贵?
【发布时间】:2013-12-07 04:01:39
【问题描述】:

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

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

此类案例的最佳做法是什么?

谢谢。

【问题讨论】:

  • 这可能取决于引擎、它应用了哪些优化等。要获得明确的答案,请尝试这两种方法并分析您的代码(在不同的浏览器中)。然后选择更好的。

标签: javascript performance scope


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我创建了一个小的jsperf 测试来产生一个想法。

    • v8 (chromium) 在没有闭包的情况下非常快,但在闭包的情况下会慢很多。获取变量必须达到多“远”无关紧要。
    • Spidermonkey (firefox) 速度较慢(Chrome 最大速度的 50%),但速度是一致的。

    因此,作为第一个近似值,您可以认为闭包更慢。不过嵌套层数对速度没有影响。

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多