new 新对象,解决fun调用参数不同引入的闭包污染

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 ,而采用注释的代码

执行会发现,得到的值全都是第二次初始化的值

跟出现闭包污染的第一种情况的值是一致的。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值