2012-10-20 31 views
1

我不知道爲什麼console.log(Set.current_index)顯示0而不是3返回JavaScript中的私有變量

var Set = (function() { 
    var set = []; 
    var index = 0; 

    function contains(set, e) { 
     for (var i = 0; i < set.length; i++) { 
      if (set[i] === e) { 
       return true; 
      } 
     } 
     return false; 
    } 

    var add = function(e) { 
     if (!contains(set, e)) { 
      set[index++] = e; 
     } 
    } 

    var show = function() { 
     for (var i = 0; i < set.length; i++) { 
      console.log(set[i]); 
     } 
    } 

    return { 
     add: add, 
     show: show, 
     current_index: index 
    }; 
})();​ 

Set.add(20); 
Set.add(30); 
Set.add(40); 
Set.show(); 
console.log(Set.current_index); 

回答

4

作爲寫入current_index只是獲取的index初始值 - 因爲這變量是原始類型的不鏡像到該值的任何變化。

如果您有'引用類型'(即對象或數組),那麼對其內容所做的更改在任何其他引用同一對象的變量中都可見。原始類型不會發生這種情況,它們會被「按值」複製到新變量中,並且對原始變量的更改不會影響副本。

你需要讓current_index功能返回的index當前值,或將其寫爲getter,它允許您通過無形地調用函數返回的電流值來治療.index爲只讀屬性。

對於後一種方法的一個例子(其需要ES5,或墊片複製功能)看到http://jsfiddle.net/alnitak/WAwUg/,這與此替換您當前return塊:

var interface = { 
    add: add, 
    show: show 
}; 

Object.defineProperty(interface, 'index', { 
    get: function() { 
     return index; 
    }, 
    enumerable: true 
}); 

return interface; 
+0

或者只是不要使用私有'index'變量,而是'add'方法中的公共屬性 – Bergi

+0

@Bergi我懷疑私有封裝對於此函數的設計很重要。 – Alnitak

+0

是的,可能的。 OP需要決定他想要什麼 – Bergi

1

的Javascript總是按值傳遞除了當一個變量指的是一個對象。所以,你的CURRENT_INDEX的初始化只是得到指數的初始值,而不是永久指向變量,這樣初始化後,兩個變量都在他們分開的方式,因此增加指數不增加CURRENT_INDEX