2013-04-01 47 views
1

我想訪問在私人環境中創建的變量。我創建一個私有上下文是這樣的:這在私人環境下

(new Function("var a = 'hello'; console.log('this', this);")).call({}); 
// outputs -> this Object {} 

call「荷蘭國際集團的功能與空上下文。但是this不包含a變量。無論如何,console.log如何處理空的上下文?

+0

爲什麼不只是調用console.log('this',a); ? –

+0

,因爲我想訪問在上下文中創建的所有變量。 – Adam

回答

2

jsFiddle Demo

裏面的範圍爲它創建的對象var a功能的存在。但是,一旦這個範圍丟失,這個變量也是如此。如果您想a堅持,你需要將其附加到正在使用this關鍵字創建的對象:

(new Function("this.a = 'hello'; console.log(this);")).call({}); 

然而,這是做它的模糊方式。有些元素在這裏不是必需的。主要是不需要new關鍵字(Function意味着一個函數對象)。 Function也附帶方法,如call

Function("this.a = 'hello'; console.log(this);").call({}); 

這也行得通。此外,如果你想保留什麼的變量,你總是可以做到這一點(demo):

var obj = {}; 
Function("this.a = 'hello'").call(obj); 
obj.a;//hello 

至於爲什麼用一個空的情況下工作。你實際上給了它一個新建的對象{}。所以當遇到參考this時,這是在函數內部使用的範圍。事實上,如果你不打算使用範圍,call()不需要參數。類似這樣的:

Function("console.log(5);").call(); 

將日誌5無誤地記錄到控制檯。


在你的問題中使用的方法是從一個魔法字符串建立一個函數。我必須說,這種方法非常酷,與eval非常相似。但你要找的東西歸結爲這種差異,我認爲:

function ball(){ 
var color = "red"; 
return color; 
} 

function Ball(){ 
this.color = "red"; 
} 

console.log(ball());//logs red 
console.log(new Ball().color);//logs red 
+0

只是一個小細節。既然你不存儲對空對象的引用,你將永遠無法以這種方式訪問​​'a'變量。 – HoLyVieR

+0

@HoLyVieR - 它顯示在對象上的日誌中。確實,這個對象的唯一範圍是在這一個班輪中,所以不會有未來的訪問可用,整個混亂將在執行後有資格進行垃圾收集。 –

+0

即使我追加父上下文,我仍然無法獲得'a'? '(new Function(「var a ='hello'; console.log(this.a);」))。call(this);'undefined – Adam