2017-05-26 135 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!' 
相關問題