Function()构造函数是否未被V8优化,如eval?

Jor*_*lez 5 javascript optimization v8

我们正在尝试通过WebSockets接收Web组件的方法.这些组件包含自定义脚本,它们应该在组件内的上下文中运行.

简而言之,我们有一些脚本字符串,并希望运行它们.

现在我们正在使用eval这个,像这样:

function ctxEval(ctx, __script) {
    eval(__script);
    // return things with the ctx
}
Run Code Online (Sandbox Code Playgroud)

并按预期工作,但我读到任何包含的函数eval都没有被V8优化.我想把它转换成new Function()这样:

new Function("ctx", __script)(ctx);
Run Code Online (Sandbox Code Playgroud)

这样我就可以实现与ctxEval上面的功能相同的功能.

我们知道,Functioneval()因为他们的行为几乎是同样的,但现在的问题是,直到这点Functioneval()?也许因为Function()它有自己的范围而不是eval在同一范围内运行代码的范围,包含Function调用的函数实际上是由V8优化的.此外,他们在这里讨论eval但不是关于Function构造函数.

另一个隐含在这个问题的问题是,Function()V8 内部运行的脚本是否正在运行?

pon*_*tek 5

我刚用这段代码测试了这个

const adder = new Function('a', 'b', 'return b%2 ? a + b : b%3 ? a - b : b%5 ? b / a : a * b');
let b = 0, b2 = 0;
function _throw() {
    throw new Error('Ups');
}
function _catch() {
    try {_throw()} catch(e) {}
}
function printStatus(fn) {
    switch (%GetOptimizationStatus(fn)) {
        case 1: console.log(fn.name, "function is optimized"); break;
        case 2: console.log(fn.name, "function is not optimized"); break;
        case 3: console.log(fn.name, "function is always optimized"); break;
        case 4: console.log(fn.name, "function is never optimized"); break;
        case 6: console.log(fn.name, "function is maybe deoptimized"); break;
    }
}
eval('function evil(a,b) {return b%2 ? a + b : b%3 ? a - b : b%5 ? b / a : a * b}');
printStatus(adder);
printStatus(evil);
printStatus(_throw);
printStatus(_catch);
// Call the function
for(let i = 0; i < 2000; i++) {
    b = adder(Math.random() * 10, b);
    b2 = evil(i, b2);
    _catch();
}
printStatus(adder);
printStatus(evil);
printStatus(_throw);
printStatus(_catch);
Run Code Online (Sandbox Code Playgroud)

运行命令

$ node --allow-natives-syntax js.js
Run Code Online (Sandbox Code Playgroud)

而输出是

anonymous function is not optimized
evil function is not optimized
_throw function is not optimized
_catch function is not optimized

anonymous function is optimized
evil function is optimized
_throw function is not optimized
_catch function is not optimized
Run Code Online (Sandbox Code Playgroud)

编辑:

我修改了这个测试代码以检查其他bailots并且真的很惊讶,因为它看起来eval也是优化的:>

编辑2:

经过一些额外的研究后,我发现了这个https://blog.sqreen.io/optimize-your-node-app-by-simply-upgrading-node-js/