【问题标题】:Javascript use explicit self/window objects to improve performanceJavascript 使用显式的 self/window 对象来提高性能
【发布时间】:2010-09-02 12:49:27
【问题描述】:

我在MSDN 上读到,为了提高脚本效率,您可以使用self 使隐式窗口引用显式化。

  1. 你知道这是不是真的吗?这是否基本上意味着例如调用self.location 比调用location 之前没有window 对象更有效?

  2. 由于 MSDN 文本引用 self 而不是 window,这种性能提升是否仅使用 self? 根据herewindowselfwindow.self 是同一个东西,所以我们使用什么并不重要,我只是要求确保。

  3. 1234563 /p>

谢谢

【问题讨论】:

  • 嗯,“window”也是“window”的一个属性:-)

标签: javascript performance window self explicit


【解决方案1】:

这是一种完全浪费时间的微优化,但值得一个常见的习惯是像这样编写 Javascript:

(function(window, undefined) {
  // your code, thousands of lines of sheer beauty
})(this);

这为您提供了对“窗口”的本地引用,以及一个可靠的“未定义”变量来引导。

为什么浪费时间?因为对于任何普通代码,您所谈论的最多是一两毫秒的执行时间。没有人会注意到这一点。确保您用于执行任何编码的实际算法 是合适的,并让 Javascript 解释器/JIT 开发人员为您节省这些毫秒数。如果你沉迷于这样的事情,你很可能会在未来得到运行更慢的代码,因为你会做一些奇怪的事情,最终没有被解释器优化。

【讨论】:

  • 我知道性能提升(如果有的话)非常小,但我的只是纯粹出于好奇。你的代码看起来很有趣,你能解释更多吗?我不明白我为什么需要它,窗口在全局范围内,为什么我需要对它的本地引用?那里的“未定义”参数是什么?谢谢。
  • 您不需要本地引用,但“window”只是一个属性名称,可以重新分配。通过从全局上下文中传递“this”,您可以更好地保证您的本地“窗口”将引用正确的内容。另外,由于它是一个局部变量,它会比引用全局“窗口”快一点。 “未定义”的东西是类似的:“未定义”只是一个属性,可以更改。通过 not 传递参数,您将获得一个 real 未定义的变量以在您的代码中使用。同样,这只是一个现代约定(参见 jQuery)。
  • 您还可以使用var undefined = void 0 设置undefined,这在其他开发人员可能调用您的函数时非常有用,该函数使用未设置的参数来表示undefined我>。如果上述开发人员不小心设置了参数,则可能会导致问题。
  • 此优化还允许 javascript minifiers 将 window 参数重命名为更短的名称,这在 window 引用全局对象时是不可能的
【解决方案2】:

虽然这是一个非常小的优化,但直接属性引用总是比变量查找更快。当您编写location 时,会执行如下操作:

  1. 寻找当前作用域中声明的location,找到则返回退出。
  2. 将范围层次结构上移一级。
  3. 如果作用域不是全局,则执行1。如果作用域是全局,则在全局作用域中检查location,如果找到则返回,否则抛出未声明变量错误。

类似的情况是made against using the with statement 为对象属性创建范围。 self 也是如此,它也是 window 的属性。 self 是对window 的引用,所以window.location 应该比window.self.location 快。另外,请记住,实现可能会有所不同,因此您的里程可能会因浏览器而异。

正如 Pointy“指出”的那样,大多数开发人员不必担心像这样的微优化。差异是微秒级的,最终用户完全察觉不到。

延伸阅读:

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多