1

我想访问在私有上下文中创建的变量。我正在创建一个这样的私有上下文:

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

我正在call使用一个空上下文的函数。但this不持有a变量。无论如何,它怎么可能console.log在空上下文中工作?

4

1 回答 1

2

jsFiddle 演示

在创建对象的函数的范围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
于 2013-04-02T00:00:08.380 回答