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()
做了我所需要的。我知道严格的模式限制,但解决这一问题相当容易,而在这种情况下,欺骗词法范围几乎是不可能的。