JavaScriptで「関数式は常に定数値」とは?const再代入時のエラー原因と対処法
JavaScriptでは、constキーワードを使って宣言された変数は定数として扱われます。一度値を代入した後、同じ変数に別の値を再代入しようとすると、プログラムの実行時にエラーが発生します。これは関数式(アロー関数など)をconstに代入した場合も同様です。
例えば、以下のようにアロー関数をconstで宣言したとします。
const result = (first, second) => first * second;
この状態で、resultに対して別の関数を再代入してみると、エラーが発生することを確認できます。
コード例
以下のコードを見てみましょう。
const result = (first, second) => first * second; result = first => first * 10; console.log(result(10, 20));
上記のプログラムを実行するには、Node.jsで次のコマンドを使用します。ここではファイル名を demo284.js としています。
node demo284.js
実行結果(エラー発生)
コンソールには「Assignment to constant variable(定数変数への代入)」というTypeErrorが表示されます。
PS C:\Users\Amit\javascript-code> node demo284.js
C:\Users\Amit\javascript-code\demo284.js:2
result = first => first * 10;
^
TypeError: Assignment to constant variable.
at Object.<anonymous> (C:\Users\Amit\javascript-code\demo284.js:2:8)
at Module._compile (internal/modules/cjs/loader.js:1133:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
at Module.load (internal/modules/cjs/loader.js:977:32)
at Function.Module._load (internal/modules/cjs/loader.js:877:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
at internal/main/run_main_module.js:18:47
エラーを解消する方法
再代入している行をコメントアウトすれば、プログラムは正常に動作します。
// result = first => first * 10;
実行結果(正常)
コメントアウト後、再度実行するとコンソールには次の出力が表示されます。
PS C:\Users\Amit\javascript-code> node demo284.js 200
result(10, 20) は 10 × 20 の計算を行い、期待どおり 200 が出力されました。このように、constで宣言した変数に関数式を格納した場合でも、その変数自体への再代入は許されません。「関数式は常に定数値である」というのは、まさにこの仕様を指しています。変数の値を後から差し替えたい場合は、letを使うか、設計を見直して再代入が不要な構造にすることが推奨されます。
-
JavaScriptの無名関数(匿名関数)とは?基本の書き方と使い方をわかりやすく解説
無名関数(匿名関数)とはJavaScriptには、関数を定義する方法として「関数宣言」と「関数式」があります。このうち関数式は、関数宣言とほぼ同じ構文で記述でき、さらに次の2種類に分けられます。名前付き関数式:関数に名前が付けられているもの(コールスタック上で名前が表示されるため、デバッグ時に便利です)無名関数(匿名関数):関数に名前を付けずに定義するもの本記事では、後者の「無名関数」について、基本的な書き方と使い方を解説します。無名関数の基本的な書き方無名関数は、functionキーワードで関数を定義し、そのまま変数に代入する形で記述します。関数名を指定しない点が最大の特徴です。var my
-
JavaScriptの名前付き関数式とは?実装方法と動作をわかりやすく解説
名前付き関数式(Named Function Expression)とはJavaScriptでは、関数式に対して名前を付けることができます。これを「名前付き関数式」と呼びます。通常の無名関数式と異なり、付けた名前はその関数の内部でのみ参照可能という特徴があります。この仕組みを活用すると、以下のようなメリットがあります。関数内部から自分自身を呼び出す再帰処理が書きやすくなるデバッグ時のスタックトレースに関数名が表示され、エラー箇所の特定が容易になるサンプルコード以下は、オブジェクトのプロパティとして名前付き関数式「factorial」を定義し、階乗を計算する例です。<!DOCTYPE ht