2013-11-22 46 views
3

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

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

这种情况下的最佳做法是什么?

谢谢。

+1

这可以取决于引擎,它应用了什么优化等。为了得到明确的答案,请尝试使用这两种方法并在不同的浏览器中剖析代码。然后选择更好的。 –

回答

-1

你可以传递变量作为参数(如果可能的话),它并不昂贵,而且更干净。

0

我创建了一个小jsperf测试有一个想法。

  • v8(铬)在没有关闭的情况下速度非常快,但在关闭时速度很慢。要达到这个变量有多远并不重要。
  • Spidermonkey(firefox)速度较慢(最大速度的50%),但速度一致。

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