私有变量在JS模块中不保持私有

时间:2016-06-17 18:38:00

标签: javascript

阅读以下文章后,  http://javascriptplayground.com/blog/2012/04/javascript-module-pattern/ 我决定开始在我的JS中实现模块。

不幸的是,我使用的模块似乎并没有将私有变量保密,

var popoverOptionsModule = (function() {
var _stopAskingList = [];

var addToStopAskingList = function(itemToAdd) {
    if (_stopAskingList.indexOf(itemToAdd) === -1){
      _stopAskingList.push(itemToAdd);
    }
}

var getStopAskingList = function() {
    return _stopAskingList;
}


return {
    addToStopAskingList: addToStopAskingList,
    getStopAskingList: getStopAskingList,
};
})();

popoverOptionsModule._stopAskingList = 4;
console.log(popoverOptionsModule._stopAskingList);

如您所见,我可以更改值 popoverOptionsModule._stopAskingList并将更新记录到控制台......我认为这不应该发生。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

JS是完全动态类型的,所以当你有行

popoverOptionsModule._stopAskingList = 4;

您刚刚创建了此变量并为其分配了值,因此下一行成功的原因。如果你没有这一行,那么后续的console.log将报告未定义。这段代码也可以使用

popoverOptionsModule._abc = 4;
console.log(popoverOptionsModule._abc);

请记住,这实际上并不是一个私有变量,就像OO语言实现保护级别一样,而只是一种试图将其隐藏在调用者之外的API模式。