var ss = {};
var test2 = function(o){
ss.test1();
}
var test = function(o){
var t = o.a;
/*
var ss = function(){
console.log(t);
}
*/
ss.test1 = function(){
console.log(t);
//success do sth
o.validate();
}
var validate = function(o){
//ss();
ss.test1();
}
return {
validate: validate
};
}
var p1 = test({
a:1
});
var p2 = test({
a:2
});
p1.validate()
p2.validate()
运行这段代码,我们会发现
在调用多次初始化的时候,我们将闭包内的值更改了
导致,你输出的状态,都是最后一次初始化的值。
可以看成是ss是一个全局的静态变量,我们在两次初始化之后
这个ss的静态变态发生了改变,并且这个值在闭包内使用,并没有被销毁。因而导致每次调用输出的值,都是最后一次初始化赋予的值。
针对这种情况,我们更改代码如下:
//封装对象
var Base = (function(){
//
var innerObj = function(a,b){
this.a = a;
this.b = b;
return this;
}
var Control1 = function(innerObj){
console.log(innerObj.a);
console.log(innerObj.b);
}
var Control2 = function(innerObj){
console.log(innerObj.a);
console.log(innerObj.b);
}
return {
innerObj:innerObj,
Control1:Control1,
Control2:Control2
}
})();
//var p1 = Base.innerObj("obj1_a","obj1_b");
//var p2 = Base.innerObj("obj2_a","obj2_b");
var p1 = new Base.innerObj("obj1_a","obj1_b");
var p2 = new Base.innerObj("obj2_a","obj2_b");
var t1 = Base.Control1(p1);
var t2 = Base.Control2(p2);
我们使用new 的方式,创建一个新的innerObj对象
在调用的时候。p1跟p2里使用的innerObj是代表两个不同的对象。
输出结果为:
不使用new ,而采用注释的代码
执行会发现,得到的值全都是第二次初始化的值
跟出现闭包污染的第一种情况的值是一致的。