我想访问在私有上下文中创建的变量。我正在创建一个这样的私有上下文:
(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({});
这也将起作用。此外,如果您想保留变量 a 中的内容,您可以随时执行此操作(演示):
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