Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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 eval可以用来声明多个全局类吗?_Javascript - Fatal编程技术网

Javascript eval可以用来声明多个全局类吗?

Javascript eval可以用来声明多个全局类吗?,javascript,Javascript,我相信这在技术上是通过设计实现的(请参阅关于表达式与类声明的讨论),但我无法找到一种方法使用eval使全局类声明按预期工作,尽管全局函数声明没有问题。这实际上是我第一次看到eval(…)产生不同的系统状态,而不仅仅是将代码直接嵌入到文件中 例如: //应该声明global window.GlobalTest 类GlobalTest{} //没问题! log({GlobalTest}); //应该声明window.A和window.B eval('function A(){}function B

我相信这在技术上是通过设计实现的(请参阅关于表达式与类声明的讨论),但我无法找到一种方法使用
eval
使全局类声明按预期工作,尽管全局函数声明没有问题。这实际上是我第一次看到
eval(…)
产生不同的系统状态,而不仅仅是将代码直接嵌入到文件中

例如:

//应该声明global window.GlobalTest
类GlobalTest{}
//没问题!
log({GlobalTest});
//应该声明window.A和window.B
eval('function A(){}function B(){}');
//没问题!
log({A,B});
//应该声明window.EvalTest
eval('class EvalTest{};');
//哦!EvalTest未定义=(
log(`typeof EvalTest:${typeof EvalTest}`);
/*有用的东西*/
//单表达式+赋值(boo!)
让SingleExpression=eval(‘(类SingleExpression{}’);
log({SingleExpression});
//作业(boo!)
eval('AssignmentExpression=class{}');

console.log({AssignmentExpression});
我在这个问题上取得了一些进展——正如@Bergi所指出的:

问题在于eval确实为词法声明创建了一个新的作用域(就像一个块一样),因此
const
class
成为
eval
ed代码中的局部变量

eval(“var a=1;let b=2;类c{}”);

console.log(typeof a,typeof b,typeof c);
我在这个问题上取得了一些进展——正如@Bergi所指出的:

问题在于eval确实为词法声明创建了一个新的作用域(就像一个块一样),因此
const
class
成为
eval
ed代码中的局部变量

eval(“var a=1;let b=2;类c{}”);

log(typeof a,typeof b,typeof c);
作为一个更新,我已经能够在进入
eval
之前通过闭包编译所有东西来让这个管道工作(它自然地将
class test{}
重命名为
var test=function(){…}
,但这是(自然的)计算极其昂贵。
class
声明是词法声明,就像
let
const
一样,并且
eval
ed代码有自己的词法范围(在严格模式下,甚至有自己的
var
iable范围)iirc.@Bergi Word。我添加了一个答案,但看起来在NodeJS之外这是不可能的。作为一个更新,我已经能够通过在进入
eval
之前对所有内容进行闭包编译来让这个管道正常工作(它自然地将
类测试{}
重命名为
var test=function(){…}
,但这是(自然的)计算极其昂贵。
class
声明是词法声明,就像
let
const
一样,并且
eval
ed代码有自己的词法范围(在严格模式下,甚至有自己的
var
iable范围)iirc.@Bergi Word。我添加了一个答案,但看起来在NodeJS之外这是不可能的。这并不重要,它们仍然创建全局变量。问题在于(就像块一样)因此,
常量
成为
eval
ed代码中的局部变量。谢谢你@Bergi,我编辑了。在我们之间,这不是真的违背了
eval
的目的吗?我从来没有遇到过
eval
ed代码的问题,导致输出与pas有实质性的不同将代码直接插入父脚本,直到出现词汇表。实际上,
var
function
声明在严格模式下的行为是相同的,因为这会破坏各种编译器优化。我从未将其视为问题。我不确定您需要什么
eval()
for,但您始终可以在DOM中创建一个内联
元素,以便在全局范围内运行代码。@Bergi I实际上在节点中工作,试图设置一个
窗口===global
状态,并允许在全局上下文中导入独立脚本,就像它们已被放入
标记或追加一样到当前文件的结尾。
vm.runInThisContext()
做了我所需要的。我知道严格的模式限制,但解决这一问题相当容易,而在这种情况下,欺骗词法范围似乎几乎是不可能的。这并不重要,它们仍然会创建全局变量。问题在于(就像街区一样)因此,
常量
成为
eval
ed代码中的局部变量。谢谢你@Bergi,我编辑了。在我们之间,这不是真的违背了
eval
的目的吗?我从来没有遇到过
eval
ed代码的问题,导致输出与pas有实质性的不同将代码直接插入父脚本,直到出现词汇表。实际上,
var
function
声明在严格模式下的行为是相同的,因为这会破坏各种编译器优化。我从未将其视为问题。我不确定您需要什么
eval()
for,但您始终可以在DOM中创建一个内联
元素,以便在全局范围内运行代码。@Bergi I实际上在节点中工作,试图设置一个
窗口===global
状态,并允许在全局上下文中导入独立脚本,就像它们已被放入
标记或追加一样到当前文件的结尾。
vm.runInThisContext()
做了我所需要的。我知道严格的模式限制,但解决这一问题相当容易,而在这种情况下,欺骗词法范围几乎是不可能的。