利用DMZ對象保護全局變量
阿新 • • 發佈:2018-01-12
empty 關心 指定 tar efi 忽略 function his 全局變量
今天偶然看到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對象將是一個更安全的選擇。
利用DMZ對象保護全局變量