2010-02-12 85 views
7

我有一個JavaScript類,看起來像這樣:範圍的「本」在JavaScript

function SomeFunction() 
{ 
    this.doSomething(function() 
    { 
     this.doSomethingElse(); 
    }); 

    this.doSomethingElse = function() 
    { 

    } 
} 

因爲範圍「這個」內()傳遞到DoSomething的功能是此代碼拋出一個錯誤不同於該功能之外的「this」的範圍。

我明白這是爲什麼,但處理這個問題的最佳方法是什麼?這是我最終做的:

function SomeFunction() 
{ 
    var thisObject = this; 

    this.doSomething(function() 
    { 
     thisObject.doSomethingElse(); 
    }); 

    this.doSomethingElse = function() 
    { 

    } 
} 

這工作正常,但它只是感覺像一個黑客。只是想知道如果有人有更好的方法。

+2

@Jon Kruger我也是這麼做的。我認爲這很正常。你可以用'call'和'apply'來改變'this',但這並不總是適合你做得很好。另一種選擇是將'this'作爲參數傳遞,但這更像是一種黑客。 – 2010-02-12 18:03:16

+0

@Jonathon你是什麼意思「你可以改變這個電話和申請」? – 2010-02-12 18:16:08

+1

@Jon Kruger看到這個,查看他們的文章「call」:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Function/Apply – 2010-02-12 18:20:19

回答

10

這是正確的和普遍接受的解決方法。它有點笨拙,但這是每個人都做的。通常,這種額外的變量被命名爲self,如:

function SomeFunction() 
{ 
    var self = this; 

    this.doSomething(function() 
    { 
     self.doSomethingElse(); 
    }); 

    this.doSomethingElse = function() 
    { 

    } 
} 
+1

請注意,'self'是瀏覽器中窗口對象的一個​​屬性,它指向自己,儘管這不太可能導致任何問題。 – 2010-02-12 19:44:29

+0

我見過的其他名字很多都是'that'和'me',這取決於上下文。 – cHao 2012-09-05 00:53:54

3

this具有動態的 「範圍」。這意味着它通過綁定它來建立,並且this被「方法調用」綁定。也就是說,任何時間在你的程序中你看到這一點:w.f()然後在執行fthis動態綁定到f甚至如果f在其詞法範圍有this

大多數JavaScript框架爲處理這個確切的問題提供了一些設施。隨着Prototype.js(例如),你可以這樣做:

this.doSomething(function() { this.doSomethingElse(); }.bind(this)); 

你「砍」不過是罰款。我通常圍繞任何需要詞法範圍的變量的函數做(function (self) { ... })(this)

1

還值得一提的是,ECMAScript的下一個版本(JavaScript語言規範)將引入Function.bind(),它將允許您指定函數的永久上下文。