2013-12-15 18 views
0

我學習JavaScript的結合,並有測試代碼如下範圍私有函數之前泄漏返回

var text = "Global Text"; 

    var FooObj = { 
     text: "Foo text", 
     GetText: function() { 
      return this.text; 
     } 
    }; 

    function BarObject() { 
     var text = "Private Bar Text"; 
     var BarGetText = FooObj.GetText; 
     alert(f()); 
     return { 
      text: "Public Bar Text", 
      GetText: BarGetText, 
      f: f 
     } 
     function f() { 
      var text = "Bar f() text"; 
      var t = BarGetText(); 
      return t; 
     } 
    } 

    var obj = BarObject(); // Global Text is alerted 
    alert(obj.GetText()); //Public Bar Text Text is alerted 
    alert(obj.f()); // Global Text is alerted 

爲f()被調用的OBJ的開始,我希望「私人欄文本」是指這個時.text在FooObj中被引用。很奇怪的是全局範圍內的文本被調用,這與FooObj和BarObject無關。任何人都可以解釋原因

回答

0

這裏的問題是如何應用範圍取決於函數如何實際調用。您應該參考MDN page for this

在函數內部,其值取決於函數的調用方式。

function f1(){ 
    return this; 
} 

f1() === window; // global object 

原因this引用window在構造函數中調用f()是由於它是一個赤裸裸的電話。後兩次調用的區別基本相同。 t的值將始終是全局文本,因爲調用BarGetText是一個「簡單調用」,不管您傳遞給它多少個對象和範圍,它都不會改變。

+0

有沒有辦法讓FooObj把BarObject的私有變量暴露給公衆? –

+0

對不起,我想我得到了解決方案。 感謝您的回答 –