在Chrome 47和的NodeJS v0.12为什么新的Function()会返回注释/ ** /在参数中?
new Function('myArg','return "my function body";')
得出以下结果:
function anonymous(myArg /**/) {
return "my function body"
}
为什么有评论/ ** /在函数参数?
在Chrome 47和的NodeJS v0.12为什么新的Function()会返回注释/ ** /在参数中?
new Function('myArg','return "my function body";')
得出以下结果:
function anonymous(myArg /**/) {
return "my function body"
}
为什么有评论/ ** /在函数参数?
如以下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})';
}
这原本是加入到追赶像下面的情况下,并抛出一个错误:
Function("/*", "*/){alert('bad');")
这将导致一个语法错误,但他们增加了前额外的/**/
,它将被翻译为:
function anonymous(/*) {
*/){alert('bad');
}
这相当于
function anonymous(/*...*/) {
alert('bad');
}
因此没有语法错误。变更后,有额外的评论这现在变成:
function anonymous(/*/**/) {
*/){alert('bad');
}
其正确给出了一个语法错误:
Uncaught SyntaxError: Unexpected token *(…)
他们需要它来修复ES6的参数解析器。等等,我会去找这个bug讨论 – Bergi
[这里是](https://code.google.com/p/v8/source/browse/trunk/src/v8natives.js#1846)简短的解释(注释)在V8引擎的源代码中:_“如果形式参数包含不平衡的块注释,则该函数必须被拒绝,因为JavaScript不允许嵌套注释,所以我们可以包含一个尾随块注释来解决这个问题。”_ – Andreas
只是让''myArg/*''不会抛出错误?或者是什么。 –