これがあなたが使うべき理由ですfunction
:
シグナリングは明確で簡潔です。これは、他の回答に記載されているエッジケースの巻き上げの懸念よりもはるかに有益です。
以下のコードからわかるように、暗黙のconst
うちにtryDoTheThing
失敗の宣言が失敗し、それを呼び出そうとするまでキャッチされないため、実際にはモジュール内でホイストする必要があります。
私が接触したほとんどのジュニアconst
は、タブの上にスペースを使用したりfunctional!!!
、「OOPが悪い」ためにすべてを作成したりするなど、今は流行なので、すべての関数を宣言し始めます。それをしないでください。あなたはその影響を完全に理解せずに流行を追うその人になりたくありません。
https://gist.github.com/stephenjfox/fec4c72c7f6ae254f31407295dc72074経由
/*
This shows that, because of block-scoping, const function references must be
invoked in-order or else things will fail silently.
const's are added the name space serially (in the order in which they appear)
and much of the body isn't declared when we first try to invoke or functions
*/
const tryDoTheThing = () => {
console.log(`This is me trying to be awesome ${getAwesome()}`)
}
// "getAwesome is not defined", because it is referenced too early
tryDoTheThing() // comment to see the rest work
const getAwesome = () => (+((Math.random() * 10000).toString().split('.')[0]))
const doTheThing = () => {
console.log(`This is awesome! ${getAwesome()}`)
}
doTheThing() // prints
対
/*
Function declarations are given two passes, where the first lifts them to
the top of the namespace, allowing "out of order" usage
*/
doTheThing();
function doTheThing() {
console.log(`This is awesome number ${getAwesome()}`)
}
function getAwesome() {
return (+((Math.random() * 10000).toString().split('.')[0]))
}