Javascript 这是在私下进行的
我想访问在私有上下文中创建的变量。我正在创建这样一个私有上下文:Javascript 这是在私下进行的,javascript,variables,object,scope,private,Javascript,Variables,Object,Scope,Private,我想访问在私有上下文中创建的变量。我正在创建这样一个私有上下文: (new Function("var a = 'hello'; console.log('this', this);")).call({}); // outputs -> this Object {} Function("console.log(5);").call(); 我正在用空上下文调用函数。但是此不包含变量。不管怎样,console.log如何在空上下文中工作? 创建对象var a的函数范围内存在。但是,一旦该范
(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}
Function("console.log(5);").call();
我正在用空上下文调用函数。但是此
不包含变量。不管怎样,console.log
如何在空上下文中工作?
创建对象var a
的函数范围内存在。但是,一旦该范围丢失,变量也会丢失。如果希望a
持久化,则需要将其附加到使用this
关键字创建的对象:
(new Function("this.a = 'hello'; console.log(this);")).call({});
然而,这是一种模糊的方法。这里有一些不需要的元素。主要是不需要new
关键字(表示函数对象)<代码>函数
还附带方法,如调用
Function("this.a = 'hello'; console.log(this);").call({});
这也会起作用。此外,如果您希望保留变量a中的内容,则始终可以执行以下操作():
至于为什么它使用空上下文。实际上,您已经使用
{}
为它提供了一个新构造的对象。因此,当遇到参考this
时,这就是函数内部使用的范围。事实上,如果您不打算使用范围,call()
不需要参数。大概是这样的:
(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}
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
只是一个小细节。由于您不存储对空对象的引用,因此您也将永远无法以这种方式以外的方式访问
a
变量。@HoLyVieR-它在日志上显示为对象上的存在。确实,此对象的唯一作用域在此一行程序中,因此将来将没有可用的访问,并且整个混乱在执行后将有资格进行垃圾收集。这是怎么回事?即使我附加父上下文,我仍然无法获取a
<代码>(新函数(“var a='hello';console.log(this.a);”)))调用(this)代码>返回undefined@Adam-此.a与var a之间存在差异。如果您使用的是console.log(a)
,那么会有loghello
。是的,但是我这样做的全部原因是,有一个对象保存我在上下文中创建的变量。为什么不直接调用console.log('this',a)?因为我想访问在上下文中创建的所有变量。