JavaScript varを使わずにconst/letを使えと言われるが


当方JavaScript歴３週間目です。長らくPythonを扱ってきたので変数のスコープはグローバルか否かの２種類しか存在しなかったのですが、先日JavaScriptには`var`を付けるか付けないか以外にも`let`や`const`といったスコープが存在することを認知いたしました。

両者の違いは理解したのですが、いざ自分の書いたソースコードを`let`と`const`のみで書き直してみるとなると、どうしても`var`が良いというところが出てきてしまいます。

[code]

    function hoge( hoge1, hoge2 ) {
    
        if ( hoge1 === "abc" ) {
            var hoge3 = "def";
        } else if ( hoge1 === "def" ) {
            var hoge3 = "ghi";
        }
    
        return hoge1 + hoge2 + hoge3;
    
    }
    
[/code]

上記のソースコードで言うと、「`hoge1` の値によって `hoge3` の値を変更したいけど、`hoge3`
はブロック外でも扱いたい！」といった感じです。（ただし本来はもっと長い処理を含むので、`if`毎に`return`するとソースコードが長くなってしまいます)

インターネット上の情報を見る限り、安全性が高いとかなんとかで「varは必要無い」といった意見が多く見られるのですが、このように関数内で共通の変数を宣言したい場合は、今でも`var`を使って良いのでしょうか...?

あるいはもっと良い方法があればご教授いただけるとありがたいです！よろしくお願いします。




`let` のスコープは、サブブロックの中でも有効ですので、  
`if` のサブブロックの外で宣言をすれば実現できます。

[code]

    function hoge( hoge1, hoge2 ) {
        let hoge3 = "aaa";
        if ( hoge1 === "abc" ) {
            // 2行目で宣言したhoge3
            hoge3 = "def";
        } else if ( hoge1 === "def" ) {
            // 2行目で宣言したhoge3
            hoge3 = "ghi";
        } else {
            // サブブロック内で同名の変数を宣言した場合は別の変数となる
            // 2行目のhoge3には影響しない
            let hoge3 = "jkl";
        }
    
        return hoge1 + hoge2 + hoge3;
    }
    
    hoge("abc", "xyz"); // = "abcxyzdef"
    hoge("def", "xyz"); // = "defxyzghi"
    hoge("ghi", "xyz"); // = "ghixyzaaa"
    
[/code]

