JavaScript中的可变范围

时间:2012-04-23 08:33:23

标签: javascript variables global-variables scope

简短的问题:

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

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

......比下一个:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

正如ECMAScript定义的那样,参考分辨率是一个内部到外部的查找过程,因此在第一个示例中,$变量 1步来自您的代码,在第二个示例中,$位于全局范围内时,它至少 2步,这会导致额外的查找开销。

然而,在现实世界中,现代javascript引擎(例如V8)没有实现与ECMAScript完全相同的参考分辨率,他们有一种方法来 flattern 范围链,在其他对于大多数代码而言,所有变量都可以在一步中引用,完全没有查询开销

结论:他们彼此真的相同。

PS:以及范围链,javascript引擎在原型链上具有完全相同的优化,因此也无需担心属性查找开销