2015-10-20 72 views
13

在Chrome 47和的NodeJS v0.12为什么新的Function()会返回注释/ ** /在参数中?

new Function('myArg','return "my function body";')

得出以下结果:

function anonymous(myArg /**/) { 
    return "my function body" 
} 

为什么有评论/ ** /在函数参数?

+5

他们需要它来修复ES6的参数解析器。等等,我会去找这个bug讨论 – Bergi

+3

[这里是](https://code.google.com/p/v8/source/browse/trunk/src/v8natives.js#1846)简短的解释(注释)在V8引擎的源代码中:_“如果形式参数包含不平衡的块注释,则该函数必须被拒绝,因为JavaScript不允许嵌套注释,所以我们可以包含一个尾随块注释来解决这个问题。”_ – Andreas

+1

只是让''myArg/*''不会抛出错误?或者是什么。 –

回答

8

如以下Chromium issue所示,这是一种解决方法,用于解决涉及不平衡块注释的边界案例。正如V8 source code描述:

function NewFunctionString(arguments, function_token) { 
    var n = arguments.length; 
    var p = ''; 
    if (n > 1) { 
    p = ToString(arguments[0]); 
    for (var i = 1; i < n - 1; i++) { 
     p += ',' + ToString(arguments[i]); 
    } 
    // If the formal parameters string include) - an illegal 
    // character - it may make the combined function expression 
    // compile. We avoid this problem by checking for this early on. 
    if (%_CallFunction(p, ')', StringIndexOfJS) != -1) { 
     throw MakeSyntaxError('paren_in_arg_string', []); 
    } 
    // If the formal parameters include an unbalanced block comment, the 
    // function must be rejected. Since JavaScript does not allow nested 
    // comments we can include a trailing block comment to catch this. 
    p += '\n/' + '**/'; 
    } 
    var body = (n > 0) ? ToString(arguments[n - 1]) : ''; 
    return '(' + function_token + '(' + p + ') {\n' + body + '\n})'; 
} 
6

这原本是加入到追赶像下面的情况下,并抛出一个错误:

Function("/*", "*/){alert('bad');") 

这将导致一个语法错误,但他们增加了前额外的/**/,它将被翻译为:

function anonymous(/*) { 
    */){alert('bad'); 
} 

这相当于

function anonymous(/*...*/) { 
    alert('bad'); 
} 

因此没有语法错误。变更后,有额外的评论这现在变成:

function anonymous(/*/**/) { 
    */){alert('bad'); 
} 

其正确给出了一个语法错误:

Uncaught SyntaxError: Unexpected token *(…) 

Source revisionoriginal bug report

相关问题