2011-05-13 46 views
1

我有以下代碼片段。這是令人困惑的,因爲我似乎無法在每個內部訪問「this」。無法在Class.create中的'each'中訪問'this'

使用的JavaScript庫是Prototype。

MyClass = Class.create({ 

    initialize : function(options) { 

    this.testmsg = 'Hi!'; 
    alert(this.testmsg); // Here it is 'Hi!' 

    var elements = $$('img'); 

    elements.each(function(element) { 
     alert(this.testmsg); // Here it is 'undefined', even though I bind 'this' 
    }).bind(this); 

    } 
}); 

我可能會做一些可怕的錯誤,但我不能只是弄清楚那是什麼。

如何在使用'Class.create'時訪問'testmsg'?

回答

2

XD ...小的(但很重要)的錯誤。

elements.each(function(element) { 
     alert(this.testmsg); // Here it is 'undefined', even though I bind 'this' 
    }.bind(this)); 

必須綁定裏面的功能,而不是每個功能

好運

+0

哈哈,謝謝!這是我尋找的答案,告訴我我做了什麼'可怕的錯誤'。 – Sander 2011-05-13 10:16:48

0

因爲this在關閉中指向函數的這個我認爲是jquery對象。

解決方案是保存thisvar

MyClass = Class.create({ 

    initialize : function(options) { 

    this.testmsg = 'Hi!'; 
    var that = this; 
    alert(this.testmsg); // Here it is 'Hi!' 

    var elements = $$('img'); 

    elements.each(function(element) { 
     alert(that.testmsg); // Here it is 'undefined', even though I bind 'this' 
    }).bind(that); 

    } 
}); 
+0

我使用的原型,而不是jQuery的;)我也有興趣在我怎麼能在封閉訪問testmsg .. – Sander 2011-05-13 10:09:50

1

這是因爲這referrs你的情況在每個循環的元素。

你可以通過改變你的類了一下解決這個問題(未測試):

MyClass = function(){ 
    var that = this; 
    this.testmsg = 'Hi!'; 
    alert(this.testmsg); // Here it is 'Hi!' 

    elements.each(function(element) { 
     alert(that.testmsg); // Here it is 'Hi!' 
    }); 
} 
+0

有趣的技術,以及由於。 – Sander 2011-05-13 10:18:31

1

你可以通過創建一個變量self是指thisinitialize功能的頂級解決這個問題。

MyClass = Class.create({ 
    initialize : function(options) { 
     var self = this; // Create a reference to 'this' 

     this.testmsg = 'Hi!'; 

     elements.each(function(element) { 
      alert(self.testmsg); 
     }); 
    } 
}); 
相關問題