5

我正在通过 AJAX 加载一个脚本文件,并运行它的内容,我正在这样做:

new Function('someargument',xhr.responseText)(somevalue);

但是,根据 MDN:

Function使用构造函数创建的对象在创建Function函数时被解析。这比声明一个函数并在代码中调用它效率低,因为使用函数语句声明的函数会与其余代码一起解析。

我真的不太明白。如果声明了一个函数,它仍然必须从文件的字符串格式中解析出来,那么为什么运行加载的字符串new Function效率会更低呢?

这对我来说真的更像是一个好奇的事情。我可以理解为什么在循环中会不好(必须重新解析相同的字符串),但是对于这样的事情,我认为没有任何问题,是吗?

4

3 回答 3

6

我认为他们的意思是,如果您在代码中使用函数构造函数,如下所示:

new Function('bar', 'console.log(bar);'));

函数体被解析两次:第一次是在加载代码时作为字符串,第二次是在运行时构造函数时。在您的情况下,您是在解析代码后从 ajax 响应创建函数,因此实际上是完全不同的交易。

于 2013-05-08T01:37:58.383 回答
3

认为MDN 文档指的是这样的东西:

var f = new Function("return 5;");

相对于:

function f() { return 5; }

前一个版本效率较低,因为它首先在 JavaScript 中String创建一个实际对象(“返回 5”),然后解析该字符串以创建一个对象。后者在没有中间字符串的情况下解析代码。Function

也就是说,在您的情况下,因为您正在动态加载 JavaScript 代码,所以我认为没有任何解决办法。

于 2013-05-08T01:39:13.010 回答
1

我不知道那篇 MDN 文章的作者是什么意思,但这是一种解释。

许多现代 JS 解释器使用优化编译器来生成本机代码。

例如,“JavaScriptCore,WebKit JS 实现”说:

在这种情况下,三种形式之间存在分层编译:初始解析和编译生成字节码,可以使用 JIT 方法进行优化,可以通过 DFG JIT 进行优化。但实际上,在大多数平台上不包含解释器,因此所有代码都通过 JIT 方法运行。

优化编译器对正在编译的代码的了解越完整,它可以执行的优化就越多,因此函数的优化程度就越高。例如,如果您知道对函数的每个引用都用于立即使用字符串作为其唯一参数来调用它,因为它是在严格的函数体中定义的,那么您可能完全可以避免为它分配函数对象并在其主体中执行某些优化。

当您调用new Function时,优化编译器不会获得执行这些和其他优化所需的上下文。

于 2013-05-08T01:48:48.787 回答