в chrome 47 и nodejs v0.12
new Function('myArg','return "my function body";')
дает следующие результаты:
function anonymous(myArg /**/) {
return "my function body"
}
почему есть комментарии/**/в аргументах функции?
в chrome 47 и nodejs v0.12
new Function('myArg','return "my function body";')
дает следующие результаты:
function anonymous(myArg /**/) {
return "my function body"
}
почему есть комментарии/**/в аргументах функции?
Как видно из следующего Chromium issue, это обходное решение для устранения случая кросс, связанного с неуравновешенными комментариями блоков. Как описано в исходный код V8:
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 *(…)