我想访问在私有上下文中创建的变量。我正在创建这样的私有上下文:
(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}
我call
使用空上下文来处理该函数。但this
并不包含a
变量。无论如何console.log
如何处理空的上下文?
答案 0 :(得分: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({});
这也有效。此外,如果您想保留变量a中的内容,您可以随时执行此操作(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