我正在通过AJAX加载脚本文件,并运行其内容我正在这样做:
new Function('someargument',xhr.responseText)(somevalue);
然而,根据MDN:
在创建函数时,将解析使用Function
构造函数创建的
Function
个对象。这比声明一个函数并在代码中调用它效率低,因为用函数语句声明的函数用其余代码解析。
我真的不太明白。如果声明了一个函数,它仍然必须从文件的字符串格式解析,那么为什么通过new Function
运行加载的字符串的效率会降低呢?
这对我来说真的是一种好奇心。我可以理解为什么它会在一个循环中变坏(必须重新解析相同的字符串),但对于这样的事情,我认为没有任何问题,是吗?
答案 0 :(得分:6)
我认为他们所说的是,如果你在代码中使用函数构造函数,就像这样:
new Function('bar', 'console.log(bar);'));
函数体被解析两次:第一次作为加载代码时的字符串,以及第二次在运行时构造函数。在您的情况下,您在解析代码后从ajax响应创建函数,所以实际上它是一个完全不同的交易。
答案 1 :(得分:3)
我认为 MDN文档指的是这样的东西:
var f = new Function("return 5;");
相反:
function f() { return 5; }
以前的版本效率较低,因为它首先在JavaScript 中创建一个实际的String
对象(“返回5”),然后解析该字符串以创建一个Function
对象。后者在没有中间字符串的情况下解析代码。
那就是说,在您的情况下,因为您正在动态加载JavaScript代码,我认为没有任何解决方法。
答案 2 :(得分:1)
我不知道该MDN文章的作者的意图,但这里有一种解释。
许多现代JS解释器使用优化编译器来生成本机代码。
例如,"JavaScriptCore, the WebKit JS implementation"说:
在这种情况下,三种形式之间存在分层编译:初始解析和编译产生字节码,可以使用方法JIT进行优化,可以通过DFG JIT进行优化。但实际上,在大多数平台上都没有包含解释器,因此所有代码都通过JIT方法运行。
优化编译器对其编译的代码具有更完整的图像,它可以执行的优化越多,因此功能的优化程度就越高。例如,如果您知道对函数的每个引用都使用字符串作为其唯一参数立即调用它,因为它是在严格的函数体中定义的,那么您可以避免为它分配函数对象并在其身体中进行某些优化。
当您调用new Function
时,优化编译器不会获得执行这些和其他优化所需的上下文。