nfp*_*lee 15 javascript module-pattern revealing-module-pattern
我以为我开始很好地理解JavaScript,但显然不是.让我用一个例子来解释我的问题.首先,我定义了以下模块:
var Test = function() {
var counter = 0;
function init() {
alert(counter);
}
return {
counter: counter,
init: init
}
};
Run Code Online (Sandbox Code Playgroud)
然后我创建了2个实例:
var test1 = new Test();
var test2 = new Test();
Run Code Online (Sandbox Code Playgroud)
现在我更新计数器变量(因为它是公共的)并做一些警报.到现在为止还挺好.
alert(test1.counter); // Alerts 0
test1.counter = 5;
alert(test2.counter); // Alerts 0
test2.counter = 10;
alert(test1.counter); // Alerts 5
Run Code Online (Sandbox Code Playgroud)
现在终于说出以下内容:
test1.init(); // Alerts 0
test2.init(); // Alerts 0
Run Code Online (Sandbox Code Playgroud)
这是我不明白的一点.为什么这个警报0?我认为第一个警报是5,第二个是10.
如果有人能解释上述内容如何起作用或指出我正确的方向,我将不胜感激.谢谢
Der*_*會功夫 13
它停留0是因为你没有更改里面的变量Test,你正在改变函数返回的对象.counter保持"私密",只有一个功能Test可以访问它.
var Test = function() {
var counter= 0;
function init() {
alert(counter);
}
function changeNum(n){
counter = n; //add a function inside `Test` so that it can
} //access the variable
return {
counter: counter,
init: init,
changeNum: changeNum
}
};
Run Code Online (Sandbox Code Playgroud)
现在它将工作:http://jsfiddle.net/DerekL/pP284/
var test1 = new Test();
alert(test1.counter); //0
test1.init(); //0
test1.changeNum(5);
alert(test1.counter); //5
test1.init(); //5
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅JavaScript闭包.
这就是发生的事情:
counter变量进行了闭包,该变量在Test scope中定义,并保存对它的引用.counter设置为internal的值counter.counter通过设置test1.counter = X来更新"另一个" ,但init()仍保留对原始变量的引用.这就是你看到旧价值的原因.
| 归档时间: |
|
| 查看次数: |
7009 次 |
| 最近记录: |