6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年12月17日 JavaScript (JS Primer) 関数とスコープ

const, let , var再復習

const

値の再代入も同じ変数名での再定義もできません。

let

値の再代入はできるが、同じ変数名での再定義はできません。

var

値の再代入も、同じ変数名での再定義もできます。 しかし、値が簡単に書き換え可能なので、ほとんど使用しません。

値の再代入 同じ変数名での再定義
const
let ⭕️
var ⭕️ ⭕️

関数宣言と巻き上げ

functionキーワードを使った関数宣言もvarと同様に、もっとも近い関数またはグローバルスコープの先頭に巻き上げられます。 以下の通り、関数の呼び出しは宣言より前に行うこともできます。

hello(); // => "Hello"

function hello(){
    return "Hello";
}

関数がスコープの先頭に巻き上げられて解釈されて実行されています。

  • varで宣言された変数へ関数を代入した場合はundefinedとなり、関数の呼び出しエラーとなります。

[コラム] 即時実行関数

即時実行関数はletやconstとブロックスコープで置き換えられるため、現在では不要なものとなりましたので参考程度に紹介されています。

  • 『即時実行関数』はその名の通り『即時実行される無名関数』です。
  • グローバルに影響しない、ローカルのスコープを作り出しそのまま処理を実行することができます。

varとletのスコープについて理解が浅かったので深堀りしました。

const let var
再宣言 ⭕️
再代入 ⭕️ ⭕️
スコープ ブロック ブロック 関数
ホイスティング エラー エラー undefined

私の場合はスコープの認識が浅く腑に落ちていなかったです。
varではブロック内で宣言をするとグローバルスコープで宣言したかのように振る舞ってしまうため、わざわざ関数を定義する必要があり、即時実行関数を使っていましたが、constとletのスコープはブロックとなったため、即時実行関数を定義する事なく、グローバルスコープを汚さずに済む仕様になりました。

参考

JS primer 関数宣言と巻き上げ

【JavaScript】var / let / const を本気で使い分けてみた