1

尝试在 Chrome 和 Firefox 中运行以下命令

(new Function('a', 'return 1;')).toString()

/**/除非没有参数,否则Chrome 在参数列表的末尾添加一个。有什么理由吗?

两种浏览器似乎都将新创建的函数命名为名称,即“匿名”。为什么要命名它?当然,它不会给所有匿名函数起这个名字......如果你只是

(function(a) { return 1; }).toString()

那么你得到的正是function(a) { return 1; }你所期望的。此外,我不能anonymous从函数内部调用 - 所以它有一个名称但它不包含在范围内?

4

1 回答 1

1

看起来答案是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, ')', StringIndexOf) != -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})';
}
于 2013-07-28T17:35:16.937 回答