javascriptのエラーメモ。
Uncaught ReferenceError: Cannot access '***' before initialization at main.js:12
原因
実行コードより後に定義した引数を使用した場合や、スコープの外から呼び出した時に表示されるエラーです。
main.js
console.log(c);
let c = 0;
let
で宣言した値は、Javascriptエンジンによるundefined
の初期化が行われません。
(※var
の場合はundefined
となる)
解決
変数の定義後に呼び出せばOK。
ポイントは、Javascriptでは初期化は巻き上げられないということです。
main.js
let c = 0;
console.log(c);
関数宣言であれば、定義前に実行しても巻き上げられて、正常に動作します。
sample.js
greeting("Tom"); // "hello Tom"
function greeting(name) {
console.log("hello " + name);
}
下記のように、無名関数を変数に格納して、関数の定義より上で実行すると…
sample.js
greeting("Tom"); // "Uncaught ReferenceError"
const greeting = function(name) {
console.log("hello " + name);
}
Uncaught ReferenceError
になります。
関数式と関数宣言の挙動の違いにも注意しましょう。
参考
変数の巻き上げ
MDN/Hoisting