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

Mar*_*ark 0 javascript ecmascript-6

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

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

doAThing();
Run Code Online (Sandbox Code Playgroud)

给出以下内容:

/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)
Run Code Online (Sandbox Code Playgroud)

(如果我做它_foo = foo然后它工作.)为什么foo没有在我的例子中定义?

Fel*_*ing 6

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

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

function foo(x, y=x) {
  console.log(x, y);
}
foo(42);
Run Code Online (Sandbox Code Playgroud)

正因为如此,第二个foofoo=foo实际上指的是参数 foo本身.它遮蔽了"外部" foo.但是你现在不能参考,foo因为它还没有被初始化.

把它想象成是一样的

let x = x;
Run Code Online (Sandbox Code Playgroud)