这在私人环境中

时间:2013-04-01 23:56:08

标签: javascript variables object scope private

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

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

call使用空上下文来处理该函数。但this并不包含a变量。无论如何console.log如何处理空的上下文?

1 个答案:

答案 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