JavaScript 中的变量作用域
Variable scopes in JavaScript
简短的问题:
假设我们包含了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 引擎在原型链上也有完全相同的优化,所以也不需要担心属性查找开销。
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量