2011-12-20 21 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; 
    } 
} 
相關問題