今天偶然看到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对象将是一个更安全的选择。