1

私はちょうどES6関数を正しく書く方法を考えています。私はそれが個人的な好みに依存していることを知っていますが、賛否両論は何ですか?ES6で機能を定義する適切な方法は?

function foo() { 
    ... 
} 

const foo =() => { 
    ... 
}; 

const foo = function() { 
    ... 
}; 

対airbnbスタイルガイドは、後者をお勧めします

const foo = function bar() { 
    ... 
}; 

。しかし、1つの関数に2つの名前を定義するのは意味がありません。

+1

私は最初の方が好きです:D –

+0

いつも正しいエラーをトレースできるように、各匿名関数に名前を割り当てることに関連すると思います。 – dloeda

+0

*名前付き関数式*を使用すると、デバッグが容易になります実際には無名関数ではなく関数名が表示されるためです。 – Li357

答えて

1

関数宣言を使用すると、コード実行前にすべての関数が処理されるように、function declaration hoistingを扱うことになります。つまり、関数が定義される前に技術的に使用でき、機能表現

foo(); //can be used before declaration appears! 

function foo() { 
    { //new block 
    function bar() { 
     alert(1); 
    } 
    } 
    bar(); //no problem, is function scoped 
} 
foo(); //alerts 1! 

を、何の巻き上げは行われません、あなたはletconstを使用する場合はブロックのスコープを持っています:トン彼らは機能がスコープされるように、ブロックスコープを持つ

function foo() { 
    { //new block 
    const bar =() => { 
     alert(1); 
    } 
    } 
    bar(); //ReferenceError: Can't find variable: bar 
} 
foo(); 

最後に、関数式という名前のを使用すると、より良いデバッグのための単なる匿名関数ではなく、関数に名前を付けることができます。従って:最後の選択を好む。それはブロックスコープを予期しています(まだホイストしていますが、コード内で宣言する前にアクセスするのは無効です)。これによりデバッグの経験が向上します。

また、矢印の機能は自分自身のthisをバインドしませんが、囲むコンテキストのthisを忘れないようにしてください。関数宣言は、厳密モードでグローバルオブジェクトwindowまたはundefinedを参照すると常にthisとなります。

+1

私にとって最善の答え。ありがとうございました! – Pawel

+0

関数は変数を作るときに自動的に命名されることに注意してください(例えば 'const f = function(){}'; 'f.name === 'f''):[" * hasNameProperty *がfalseならSetFunctionName * rval *、GetReferencedName(* lref *))。 "](https://tc39.github.io/ecma262/#sec-assignment-operators-runtime-semantics-evaluation) – towerofnix

0

最初のものは、エラーを回避するという利点があります(hoisting)ので、その宣言の前に関数を使用することができます。

他のオプションを使用すると、そのポイントの前にあるため、宣言の後でのみ使用できます。だから私は最初のオプションが最も安全なものだと言います。

+0

私は正直に同意しない。私は、宣言後の使用は良いことだと言うでしょうが、関数宣言は関数スコープですが、letやconstを使った式はブロックスコープです。最後に、「これ」は大きく異なった扱いをしていました。 – Li357

関連する問題