我想訪問在私人環境中創建的變量。我創建一個私有上下文是這樣的:這在私人環境下
(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}
我call
「荷蘭國際集團的功能與空上下文。但是this
不包含a
變量。無論如何,console.log
如何處理空的上下文?
我想訪問在私人環境中創建的變量。我創建一個私有上下文是這樣的:這在私人環境下
(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}
我call
「荷蘭國際集團的功能與空上下文。但是this
不包含a
變量。無論如何,console.log
如何處理空的上下文?
裏面的範圍爲它創建的對象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
爲什麼不只是調用console.log('this',a); ? –
,因爲我想訪問在上下文中創建的所有變量。 – Adam