5

在过去的 4 个月里,我一直在从事网络项目。为了优化代码性能,我们使用了一种模式。我的疑问是,它是否真的提高了性能?

当我们必须使用this对象时,我们将它分配给一个局部变量,并使用它。

function someFunction()
{
  var thisObject = this;
  //use thisObject in all following the code. 
}

这里的假设是,将this对象分配给本地堆栈变量将提高性能。

我在任何地方都没有见过这种类型的编码,所以怀疑它是否没用。

编辑:我知道将此对象分配给局部变量是为了保留对象,但这不是我们的情况。

4

3 回答 3

7

虽然这是 Javascript 中的常见做法,但出于性能原因并没有这样做。this对象保存在另一个命名的本地通常是为了保留this函数中定义的跨回调的值。

function someFunction() {
  var thisObject = this;
  var someCallback = function() {
    console.log(thisObject === this);  // Could print true or false
  };
  return someCallback;
}

计算结果是否thisObject === this为真将取决于它的调用方式

var o = {} 
o.someFunction = someFunction();
var callback = o.someFunction();
callback();        // prints false
callback.call(o);  // prints true
于 2012-04-16T14:40:08.423 回答
2

与所有性能问题一样,应该通过实际测量性能来检查它们。在一个相当简单的测试用例中(您的实际代码可能会有所不同),我发现浏览器的结果不同:

在此处输入图像描述

Chrome 和 Firefox 在这两个测试之间没有太大差异,但两者之间的细微差别是相反的方向。IE9 使用保存的副本显示测试this,我称self它的速度要慢得多。

如果 Chrome 和 Firefox 以及 IE9 没有显着且一致的性能差异显示this测试用例明显更快,我认为您可以得出结论,您询问的设计模式没有在浏览器之间提供一致的性能提升。

this在我的代码中,仅当我需要它以一致地引用内联事件处理程序、回调或this已设置为其他内容的方法中的原始对象时,我才将其副本保存到另一个变量。换句话说,我只在需要时应用这种设计模式。

之前关于 SO 的此设计模式的讨论中,得出的结论是,一些库使用此设计模式是为了允许额外的最小化,因为this在它占用的四个字符以下无法缩小,但可以将其分配给局部变量缩小为单个字符变量名。

于 2012-04-16T15:10:56.193 回答
0

即使这种优化有(积极的)效果,也很可能依赖于解释器。

其他版本可能会恢复结果。

但是,最终你应该衡量,而不是猜测。

于 2012-04-16T14:43:19.840 回答