3

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

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

  2. 由于 MSDN 文本是指self而不是window,这种性能提高是否只发生在使用self?根据here window and selfandwindow.self是同一件事,所以我们使用什么并不重要,我只是要求确保。

  3. 此外,按照 MSDN 中所述的调用window.self应该比调用更高效,self因为最后一个是属性,window所以通过调用window.self我们使用显式引用。

谢谢

4

2 回答 2

2

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

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

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

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

于 2010-09-02T12:55:36.550 回答
1

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

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

类似的情况是反对使用该with语句为对象属性创建范围。也是如此self,它也是 的一个属性windowself是参考window,所以window.location应该比window.self.location. 另外,请记住,实现可能会有所不同,因此您的里程可能会因浏览器而异。

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

进一步阅读:

于 2010-09-02T13:00:30.467 回答