2012-04-23 99 views
2

简短问题:JavaScript中的变量范围

假设我们包含了jQuery。将这个函数执行得更快......

var example1 = (function($, jQuery) { 
    return function() { 
     // do something 
    } 
})() 

...比下面的例子:

var example2 = (function() { 
    return function() { 
     // do something 
    } 
})() 

在第一个jQuery对象将是undefined,在第二个它将被继承。所以第二个应该更贵?

提高速度和摆脱继承变量会降低性能的最佳方法是什么?

jsPerf测试:http://jsperf.com/objinheritance

+1

这可能会回答你的问题:http://stackoverflow.com/questions/9248963/javascript-why-the-access-to-closure-variable-might-be-slow – 2012-04-23 08:37:22

+0

在第二个它不会被继承,会吗?它只是全球性的。就像第一个一样。如果你在本地访问它,它只是未定义的,你仍然有window。$和window.jQuery。 – 2012-04-23 08:45:20

+1

Quote:“过早优化是万恶的根源”。继续学习JS中的范围,非常好 - 但不要为了优化而优化。这个特定问题只有在一段代码执行数千次(一次)时才有意义。谷歌关键字:“scope-chain”。电脑(CPU)的时间比开发者时间便宜很多! – 2012-04-23 08:49:54

回答

3

作为ECMAScript的定义,参考分辨率是一个内部至外查找过程,所以在第一示例中,$变量是1步骤从您的代码,并在第二个示例,虽然$驻留在全局范围内,但至少有两个步骤以外,这会导致额外的查找开销。然而,在现实世界中,现代JavaScript引擎(例如V8)并没有像ECMAScript那样实现参考分辨率完全相同的方式,他们有一个方法到flatten范围链,换句话说,对于大多数代码中,所有变量都可以在中参考一步,根本没有查找开销

结论:他们彼此真的是一样的。

PS:还有作用域链,JavaScript引擎对原型链完全一样的优化,所以也没有必要担心属性查找开销。