2017-05-26 147 views
0
const foo =() => 'foo!'; 

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

doAThing(); 

提供了以下:为什么ES6的默认参数函数没有定义?

/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那么它的工作原理) 为什么没有在我的例子定义富?

+0

'foo'也是一个常数:思想: – Tvde1

+5

foo'阴影外'foo',即使在默认值的参数'。 –

+0

大概是因为在那个范围内'foo'指的是你尚未设置的参数的值。见例如http://2ality.com/2015/02/es6-scoping.html#parameter-default-values-and-the-temporal-dead-zone – jonrsharpe

回答

6

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

评估参数定义创建了一个新的作用域,其中定义了参数。这允许您参考默认值中的参数,例如

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

的,因为并且,在foo=foo第二foo实际上指的是参数foo本身。它阴影“外”foo。但是此时您不能参考foo,因为它尚未初始化。

想想看作为是一样

let x = x; 
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!' 
相关问题