Подтвердить что ты не робот

Почему new Function() возвращает комментарии/**/в аргументах?

в chrome 47 и nodejs v0.12

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

дает следующие результаты:

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

почему есть комментарии/**/в аргументах функции?

4b9b3361

Ответ 1

Как видно из следующего 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})';
}

Ответ 2

Это было первоначально добавлено, чтобы уловить такие случаи, как следующее, и вызвать ошибку:

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

Это должно привести к синтаксической ошибке, но прежде чем добавить дополнительный /**/, он будет переведен на:

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

Что эквивалентно

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

И, следовательно, синтаксическая ошибка. После изменения, с дополнительным комментарием, это теперь становится:

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

который корректно дает синтаксическую ошибку:

Uncaught SyntaxError: Unexpected token *(…)

Исходная версия и исходный отчет об ошибках.