Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是在私下进行的_Javascript_Variables_Object_Scope_Private - Fatal编程技术网

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)
,那么会有log
hello
。是的,但是我这样做的全部原因是,有一个对象保存我在上下文中创建的变量。为什么不直接调用console.log('this',a)?因为我想访问在上下文中创建的所有变量。