【问题标题】:Variable scopes in JavaScriptJavaScript 中的变量范围
【发布时间】:2012-05-03 20:51:41
【问题描述】:

小问题:

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

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

...比下面的一个:

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

?

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

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

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

【问题讨论】:

  • 这可能会回答你的问题:stackoverflow.com/questions/9248963/…
  • 第二个不会被继承吧?它将是全球性的。就像第一个一样。只有在本地访问它是未定义的,你仍然有 window.$ 和 window.jQuery.
  • 引用:“过早的优化是万恶之源”。继续学习 JS 中的作用域,非常好 - 但不要为了优化而优化。仅当一段代码(一次)执行数千次时,此特定问题才相关。谷歌的关键字:“范围链”。计算机 (CPU) 时间比开发人员时间便宜得多!!!
  • 我不认为全局变量会降低性能,我也不认为用未定义的局部变量使它们黯然失色会提高性能。我也不认为值得为随着时间的推移可能不成立的性能损失编写令人困惑/丑陋的代码。只需编写正常、干净的代码,让 JavaScript 引擎开发人员担心底层性能。
  • 请注意这与继承无关 (objinheritance?)。第一个 sn-p 是词法闭包和变量遮蔽的示例——参数 over-shadow 是 jQuery 定义的全局变量。

标签: javascript variables global-variables scope


【解决方案1】:

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

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

结论:它们确实彼此相同。

PS:和作用域链一样,javascript引擎对原型链的优化也差不多,所以也不用担心属性查找开销.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2012-12-23
    • 2011-05-10
    • 2011-07-07
    相关资源
    最近更新 更多