【发布时间】:2017-11-04 02:14:12
【问题描述】:
我们正在尝试一种通过 WebSockets 接收 Web 组件的方法。这些组件包含自定义脚本,它们应该在组件内部的上下文中运行。
简而言之,我们有一些脚本字符串并且想要运行它们。
现在我们为此使用eval,如下所示:
function ctxEval(ctx, __script) {
eval(__script);
// return things with the ctx
}
并按预期工作,但我读到任何包含 eval 的函数都没有被 V8 优化。我想像这样将其转换为new Function():
new Function("ctx", __script)(ctx);
这样我就可以实现和上面ctxEval函数一样的效果了。
我们知道Function 是eval(),因为它们的作用几乎相同,但现在的问题是,直到Function 是eval()?可能是因为Function() 有自己的作用域,而不是eval 在同一作用域内运行代码,所以包含Function 调用的函数实际上是由V8 优化的。另外,here 他们谈论的是eval,但不是Function 构造函数。
这其中隐含的另一个问题是,Function() 内部运行的脚本是否经过 V8 优化?
【问题讨论】:
-
为什么首先需要使用
eval?不能正常运行 JavaScript 吗? -
@Halcyon 我们从套接字接收脚本作为字符串。不包含在连接服务器的主脚本中。
-
@ponury-kostek 所以匿名函数没有优化?不知道
-
@JorgeFuentesGonzález 只需将其设置为创建的脚本元素的
innerHTML并将其附加到文档中。不需要eval。
标签: javascript optimization v8