2011-06-30 107 views
2

我試圖通過模塊模式設置私有變量的值。 所以我說的是將$ content設置爲我傳遞給person.content的值。但這似乎並不奏效,因爲當我對該值做出警報時,它會給我一個未定義的錯誤。模塊模式更新變量

$(document).ready(function(){ 
    person.content = $('#content'); 
    person.getContent(); 

}); 

// Person Module 
var person = (function(){ 

     var $content; 


     function getContent(){ 
       alert('content = '+$content.find(':first h2').text()); 
     } 

     return { 
      content: $content, 
      getContent : getContent, 

     } 

    }()); 

回答

5

你的問題是,當你這樣說:

person.content = $('#content'); 

你不改變var $content;裏面的功能,你只是改變personcontent屬性的值。然後,當你這樣說:

person.getContent(); 

getContent功能將使用(初始化)var $content外部函數裏面。你將需要添加一個setContent功能:

var person = (function(){ 
    var $content; 
    function setContent(c) { 
     $content = c; 
    } 
    // ... 
    return { 
     setContent: setContent, 
     getContent: getContent 
    }; 
}()); 

並確保你不離開,在你的返回對象尾隨逗號,IE瀏覽器的大多數(全部?)版本生氣有關。

,然後在別處:

person.setContent($('#content')); 
person.getContent(); 

取決於你的目標瀏覽器和版本,則可以將返回的對象定義getter和setter函數的性質:

但使用一個明確的突變基因功能將工作無處不在。

0

想象像指針這樣的對象中的值。

person是一個對象,其中content屬性指向閉包中的$content值。當您執行person.content = somethingElse時,則您將人物對象的content屬性設置爲指向somethingElse

考慮關閉了它,這說明了同樣的事情:

var a = 'a'; 
var b = 'b'; 

var obj = { a: a } 
alert(obj.a) // "a" 

obj.a = b; 
alert(obj.a) // "b" 
alert(a) // "a" 

設置的對象屬性設置爲一個新的對象,從來不做事,以所用的是有分配的對象。它只是指向一個新的而不同的對象。

分配此內私有變量的唯一方法是從封閉件的內部,像在setContent方法說。

return { 
    getContent: function() { return $content; }, 
    setContent: function(val) { $content = val; } 
};