1. 程式人生 > >利用DMZ對象保護全局變量

利用DMZ對象保護全局變量

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對象保護全局變量