利用DMZ对象保护全局变量

本文探讨了JavaScript中this绑定的一个特殊情况,即当使用apply、call或bind方法时传入null或undefined作为上下文对象,可能导致全局变量被意外修改的问题,并提供了一种解决方案——使用DMZ对象。

今天偶然看到this绑定有个比较例外的例子会直接忽略指定的绑定对象。

当给apply/call/bind传入null或undefined时会出现这种情况:

function foo(){
    console.log(this.a);
}

var a=2;

// 传入null
foo.apply(null);      // 2

非严格模式下foo函数中的this被默认绑定到全局对象(只要函数体(不是函数调用位置)处于严格模式下,会绑定到undefined),自然输出就是2。

如果此时全局a被篡改就麻烦了,例如:

function foo(){
    this.a="linwei";
}

var a=2;

// 传入null
foo.apply(null);

console.log(a);     // linwei

此时全局a就被篡改了,可能会引发bug。

此时可以用一个DMZ(Demilitarized zone,非军事区)对象来保护全局变量,这个DMZ对象本质上是一个“裸”对象(详见贺老的文章http://hax.iteye.com/blog/1663476):

function foo(){
    this.a="linwei";
}

// 创建DMZ对象
var empty=Object.create(null);

var a=2;


foo.apply(empty);

console.log(a);     // 2,不会被篡改成"linwei"

这样就达到保护全局变量a的目的。

如果函数并不关心this值,可以传入一个比null更安全的占位值,DMZ对象将是一个更安全的选择。

转载于:https://www.cnblogs.com/linweinb/p/8270780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值