2012-04-16 137 views
5

我一直致力于过去4个月的web项目。为了优化代码性能,我们使用了一种模式。我的疑问是,它是否真的提高了表现?javascript this object

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

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

的假设是,分配this对象到局部堆栈变量将提高性能。

我还没有看到这种类型的编码在任何地方,所以怀疑它是没有用的。

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

+1

这在Node.js中非常常见。但这更多的是在回调中持有参考,而不是我相信的业绩提升。 – Chad 2012-04-16 14:39:20

+1

我会猜测,这实际上是对性能更差*。 Google Closure Compiler(使用高级优化)将删除var声明并用'this'替换'thisObject'的实例,即使使用变量通常会导致缩小的大小。 Closure编译器针对速度和大小进行了优化,但在选择时似乎更喜欢速度超过大小。 – 2012-04-16 14:45:24

回答

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评估为true,将取决于它如何被称为

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

我们在没有任何回调的简单函数中使用了这种模式。我想知道的是它有任何性能提升? – 2012-04-16 14:43:30

+0

@TejeshAlimilli这是不太可能,这有任何明显的性能差异 – JaredPar 2012-04-16 14:44:00

+0

谢谢。这就是我想知道的。 – 2012-04-16 14:45:28

0

即使这种优化中的(积极)的效果,很可能取决于解释。

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

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

2

与所有性能问题一样,应通过实际测量性能来检查它们。在rather simple test case(实际代码可能会有所不同部分),我发现不同的浏览器不同的结果:

enter image description here

Chrome和Firefox没有什么不同的两个测试之间非常多,但略有不同的是相反的两者之间的方向。 IE9显示测试使用this保存的副本,我称self要慢得多。

没有在Chrome和火狐和IE9一个显著和一致的性能差异呈现更快的为基本this测试情况下,我认为你可以断定你问的设计模式约不提供跨浏览器一致的性能提升。

在我的代码,我的this副本保存到,只有当我需要它在那里this已被设置为别的联事件处理程序,回调或方法的内部一致的参考原始对象的另一个变量。换句话说,我只在需要时才应用这种设计模式。

previous discussion of this design pattern here on SO,得出的结论是一些图书馆采用这种设计模式,以便使更多的最小化,因为this不能,它占用了四个大字下面精缩,但其分配到一个局部变量可以精缩到单个字符变量名称。

+0

Opera似乎对测试用例进行了微优化,它们的运行时间完全相同:-) – Bergi 2012-04-16 15:28:12