在ES6中使用相同的参数名称作为其默认参数

这个ES6代码:

const log = () => console.log('hi');
const parent = (log = log) => log();
parent();

运输到:

var log = function log() {
    return console.log('hi');
};
var parent = function parent() {
    var log = arguments.length <= 0 || arguments[0] === undefined ? log : arguments[0];
    return log();
};
parent();

给出错误:

    return log();
           ^
TypeError: log is not a function

问题是这条线:

const parent = (log = log) => log();

因为参数名称与其默认参数相同。

这工作:

const log = () => console.log('hi');
const parent = (logNow = log) => logNow();
parent();

这是Babel中的一个bug还是这个规范本身不允许?


似乎这是ES6的预期行为。 在Chrome控制台上测试,也出现错误。

ES6规格说明了这一点:

  • 让parameterNames是形式的BoundNames。 http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation
  • 这意味着当你创建函数时,ES6将会像babel一样做基本相同的事情,它将管理新环境中参数的分配。

    在JavaScript中,当你创建一个变量a在封闭的范围内,全球的a ,不能再访问,因为JS会拿a从最近的可能范围,AST。

    简单的例子:

    var a = 1;
    function test() {
      // creates the variable a, and try to assign a value to it,
      // because `a` is now available in the scope itself, it will take value of a in the inner scope, not the outer scope one
      var a = a;
      console.log(a)
    }
    test() // undefined
    

    为什么它不考虑外部a的价值,然后将它分配给内部a,是因为提升 ,基本上是这样做的:

    function test() {
      var a; // the address for the variable is reserved at compile time
      a = a; // run-time assignment 
    }
    

    它接受函数的所有变量声明并将其提升到函数的开头。

    这就是为什么这样的原因会起作用的原因:

    function hoistingTest(n, m = 2) {
      // return immediately
      return multi(n);
    
      // This declaration will be hoisted to the begin of the body
      function multi(n) { return m * n }
    }
    
    链接地址: http://www.djcxy.com/p/35207.html

    上一篇: Using same argument name as its default parameter in ES6

    下一篇: build make does not detect any bugs