2012-08-23 47 views
0

我錯過了解js如何工作的內容。這裏的問題:js私有變量賦值

我們宣佈一個模塊是這樣的:

ns.obj = function() { 
    // declare private variables 
    var test = 1, test1 = 2; 

    // declare some private function 
    var myFunc=function(){test=2}; 

     return{test:test, myFunc:myFunc}; 
} 

每次myFunc被調用,因爲我們沒有在聲明函數JS裏面測試應該承擔我們指的是私有變量。

如果我們有模塊,返回的對象確保我們有test和myFunc可見。所以調用ns.obj.test首先應該給我們一個。我們稱myFunc後,應該給我們2.但它總是1.爲什麼會發生?

這裏的的jsfiddle:http://jsfiddle.net/aXuwB/1/

+1

我覺得你的jsfiddle鏈接是錯誤的 – AlvaroGMJ

+0

是的,你是正確的,它更新。 –

回答

1

在JavaScript重寫變量不覆蓋任何其他地方。你有效地將數字1傳遞給你的返回對象;沒有提及test變量。

您有一個選項正在返回一個函數。一個函數保存代碼,因此可以保存對變量的引用。調用它會給你的變量:test: function() { return test; }

+0

測試變量是在他的函數 – badunk

+1

@badunk中指定的:是的,但他正在重新調整數字值。覆蓋'test'不會覆蓋返回的對象。 – pimvdb

+0

觀看附帶的jsfiddle。數組的絕對相同的代碼給出了不同的結果。如果我打電話推好,我可以看到結果。如果我重新啓動陣列,它不會顯示出來。 –

0

我認爲這與您每次執行該功能時聲明新的var test=1這一事實有關。爲了澄清,每次您撥打ns.obj()時,您將重新分配一個新的測試變量爲1,然後將其返回到您的對象中。因此,該值始終爲1.

當您調用myFunc函數時,它將根據需要修改您的私有變量,但您沒有乾淨的方式訪問私有變量(不需要重新設置值) 。

在這個看一看,看看這說明你想要什麼:

var ns = {}; 
ns.obj = function(){ 
    var test = 1; 
    this.myFunc = function(){ 
     test=2 
    }; 
    this.getTest = function(){ 
     return test; 
    } 
} 

var testObj = new ns.obj(); 
console.log(testObj.getTest()); 
testObj.myFunc() 
console.log(testObj.getTest()); 
+0

它執行一次以初始化對象文字。之後,我只是使用它。所以情況並非如此。 –

+0

我很困惑,當你說你調用myFunc時,它應該返回2 - 但該函數不會返回任何值 – badunk

+0

badunk,請檢查jsfiddle。它是一個模塊,功能在開始時被稱爲一次。 –

0
var User = function() { 
    var age = 0; // private 
    this.incrementAge = function() { 
     return age++; 
    } 
    return this.incrementAge(); // closure 
}; 

var firstUser = new User(); 
console.log('firstUser', firstUser.incrementAge()); // 1 

var secondUser = new User(); 
console.log('secondUser', secondUser.incrementAge()); // 1 
console.log('secondUser', secondUser.incrementAge()); // 2