2011-07-13 86 views
0

以下是兩個代碼示例。第一個不起作用,第二個起作用,儘管我完全不知道爲什麼。有人可以解釋這個嗎?爲什麼在調用對象內部的函數時「this.myFunction」不起作用?

[我正在寫一個使用jQuery的一點的一個簡單的遊戲在WebKit瀏覽器(後來與鈦包裝)進行播放。]

在第一個例子,螢火告訴我,「this.checkCloud」不是一個功能。

function Cloud(){ 

    this.checkCloud = function(){ 
     alert('test');    
    } 

    $("#"+this.cloudName).click(function(){ 
     this.checkCloud(); 
    }); 

} 

...但後來這個工程:

function Cloud(){ 

    this.checkCloud = function(){ 
     alert('test');    
    } 

    var _this = this; 

    $("#"+this.cloudName).click(function(){ 
     _this.checkCloud(); 
    }); 

} 

這一個完美的作品。

爲什麼第一個不起作用?是否因爲「this.checkCloud」在匿名函數中?

回答

2
在這個例子中

$("#"+this.cloudName).click(function(){ 
     this.checkCloud(); 
    }); 

this引薦到元件選擇(jquery對象)。

你可以做的是使用私有函數

var checkCloud = function(){ 
     alert('test');    
    } 

這種方式,您可以簡單地調用它的匿名函數內部

$("#"+this.cloudName).click(function(){ 
      checkCloud(); 
     }); 
+0

所以在JavaScript中,「var」就像是在一個函數中創建一個私有的東西。這就說得通了。 – dbonneville

0

當你給一個元素分配一個偶數監聽器時,jQuery確保this將引用該元素。但是,當你創建_this變量時,即使它想要創建一個jQuery不能混淆的閉包。

+0

無關尤其是jQuery,而是一般的JavaScript。 –

+0

@Michael優秀點!我會爲你的答案付出努力! – sdleihssirhc

+0

@Michael:jQuery手動設置'this'的值來引用調用處理函數的元素。如果'Cloud()'沒有被作爲構造函數調用,並且我們使內部函數只是一個典型的命名函數,並且調用了它,代碼就可以工作,因爲這兩個函數中的this都會引用'window'(除非你'重新進入嚴格模式)。 **例子:** http://jsfiddle.net/9NmPF/1/ – user113716

2

這是因爲每次通過函數創建新範圍時,this的含義都可能會發生變化。 this的含義取決於函數如何被調用(並且規則可能非常複雜)。正如您發現的那樣,簡單的解決方案是創建第二個變量,將this保存在this具有預期/期望值的範圍內,然後重新使用該變量而不是this在新功能範圍中引用同一對象,其中this可能會有所不同。

+0

*「'this'指向封閉範圍......'this'在最裏面的函數中指最內層的函數」*雖然它可能(或者可能不會)隨每個函數而改變,它不會引用封閉範圍,也不會引用函數本身(除非您已經這麼做)。我們不知道*如何調用'Cloud()',所以我們不知道該函數中有什麼'this'。 – user113716

+0

@帕特里克,好點。我添加了一些關於它的附加信息。我意識到這可能仍然不是100%正確的,但它是考慮它的有用方法。 –

+0

是的,''這是javascript中的一個奇怪的主題。至少有六種不同的事情需要考慮,可能會改變這個「價值」。 – user113716

1

試試這個:

function Cloud(){ 

    this.checkCloud = function(){ 
     alert('test');    
    } 

    var func = this.checkCloud; 

    $("#" + this.cloudName).click(function(){ 
     func(); 
    }); 
} 
相關問題