为什么没有定义ES6默认参数功能?

时间:2017-05-26 21:19:42

标签: javascript ecmascript-6

const foo = () => 'foo!';

const doAThing = (
    foo = foo
) => {
    console.log(foo)
}

doAThing();

给出以下内容:

/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:4
    foo = foo
          ^

ReferenceError: foo is not defined
    at doAThing (/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:4:8)
    at Object.<anonymous> (/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:9:1)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:423:7)
    at startup (bootstrap_node.js:147:9)

(如果我将它设为_foo = foo那么它就可以了。) 为什么我的例子中没有定义foo?

2 个答案:

答案 0 :(得分:6)

  

为什么我的例子中没有定义foo?

评估参数定义会创建一个定义参数的新范围。这允许您引用默认值中的参数,例如

&#13;
&#13;
function foo(x, y=x) {
  console.log(x, y);
}
foo(42);
&#13;
&#13;
&#13;

正因为如此,foo中的第二个foo=foo实际上是指参数 foo本身。它会影响&#34;外部&#34; foo。但此时您无法引用foo因为它尚未初始化。

将其视为与

相同
let x = x;

答案 1 :(得分:2)

const foo = () => 'foo!'; //1
                          //2
const doAThing = (        //3
    foo = foo             //4
) => {                    //5
    console.log(foo)      //6
}                         //7

doAThing();

在第3行,你写foo = foo。在这里,您尝试声明一个变量,并在声明它之前使用该变量。因为您为参数指定了名称foo,所以当您编写foo = foo时,它会尝试引用自己。该作业的右侧不是您在其上方声明的函数foo。要解决此问题,请更改参数名称。

const foo = () => 'foo!'; //1
                          //2
const doAThing = (        //3
    func = foo            //4
) => {                    //5
    console.log(func)     //6
}                         //7

doAThing();               // -> () => 'foo!'