JavaScript 中的变量作用域

Variable scopes in JavaScript

本文关键字:作用域 变量 JavaScript      更新时间:2023-09-26

简短的问题:

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

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

。比以下一个:

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

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

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

jsPerf test: http://jsperf.com/objinheritance

正如 ECMAScript 所定义的,引用解析是一个从内到外的查找过程,因此在第一个示例中,$ 变量距离代码 1 步,而在第二个示例中,虽然$驻留在全局范围内,但它至少相距 2 步,这会导致额外的查找开销。

然而,在现实世界中,现代 JavaScript 引擎(如 V8)并没有像 ECMAScript 所说的那样实现引用解析,它们有一种扁化作用域链的方法,换句话说,对于大多数代码,所有变量都可以在一个步骤中引用,根本没有查找开销

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

PS:除了作用域链,javascript 引擎在原型链上也有完全相同的优化,所以也不需要担心属性查找开销。