2011-12-20 24 views
2

我与原型方法工作,这里是之情况Javascript - 使用本地var还是这个?

function Foo() { 
    this.x = 5; 
    this.y = 2; 
    this.z = this.addValues(); 
} 
Foo.prototype = { 
    addValues: function(){ 
     return this.x + this.y; 
    } 
} 

显然,这只是一个简单的例子;在真正的项目中,'addValue'函数中会有很多活动。使用'this'关键字100s的时间或者将其缓存到局部变量有助于任何性能改进。例如,下面会有什么区别?

Foo.prototype = { 
    addValues: function(){ 
     var self = this; 
     return self.x + self.y; 
    } 
} 
+0

后者通常只在需要保存当前上下文时使用,因为“this”即将更改。 – 2011-12-20 02:10:17

+0

'this'(有效)是一个局部变量,它在进入执行上下文时被设置。所以使用它应该与局部变量具有相同的性能,可能会更快。 – RobG 2011-12-20 02:14:06

回答

2

this是访问xy的标准方式。从缓存this到一个本地变量你将没有任何改进 - 如果有的话,你首先声明self是在浪费空间。

唯一可能风险你会看到是这样的:

var f = new foo(); 
var stupid = f.addValues; 
stupid(); // whoops - this is suddenly the global object, 
      // and your method is broken. 

话虽如此,我不认为你是负责人滥用你的功能,我不会”不用担心。

另外,按照惯例,意图用作构造函数的函数应该以大写字母开头。考虑重命名fooFoo

+0

感谢Adam Rackis和所有人的答案! – user1106995 2011-12-20 02:23:00

+0

@ user1106995 - 我的荣幸。祝你好运 – 2011-12-20 02:24:23

+0

+1,但'var stupid = f.foo'事件不受这个问题中提出的代码的影响。 – nnnnnn 2011-12-20 02:47:29

5

self.xthis.x之间可能没有任何有意义的区别。什么可能有所作为是

var x = this.x, y = this.y; 

    // massive amounts of computation involving x and y 

这种微的优化可能是不值得的,除非你真的参与了一些前沿的游戏开发或什么的。获取您的算法数据结构先放弃,然后担心最后这样的东西。你永远不知道JavaScript运行时系统的开发者什么时候会引入新的优化。他们无法修复您的错误算法,但它们会显着影响微观优化。

+1

此外,这样的优化可能会提高某些UA的性能并降低其性能其他。例如在while循环中使用递减计数器的速度在某些浏览器中要快得多,但在其他浏览器中则会非常慢。在更新的浏览器中,速度与循环标准(主要是)相当。 – RobG 2011-12-20 02:16:18

+0

@RobG是的 - 事情通常不是一个好主意,除非有一个用户代理在某些特定的事情上是绝对可怕的。 – Pointy 2011-12-20 02:17:54

+0

+1指出了微观优化,并提到它可能不会有所作为 – 2011-12-20 02:25:35

0

在此示例中,将this分配给self应该没有任何区别。 JavaScript不会按值分配对象,而是通过引用,这意味着selfthis都指向同一个对象。你这样做没有收获。

foo.prototype = { 
    addValue: function(){ 
     // self and this point to the same object! 
     var self = this; 
     return self.x + self.y; 
    } 
} 
相关问题