スコープのメモ
JavaScriptのスコープのメモ
- 宣言してない -> ReferenceError: a1 is not defined 実行時エラーとなる。
- 宣言したけど値が設定されていない -> undefined 実行時エラーとはならない。
- 関数の定義でスコープができる。スコープは静的(lexical scope)。(vs this)
- for, if, while等のブロックスコープなし(ECMAScript2015以前)。
- スコープはネストする。カードが積み重なるイメージ。
- 内側のスコープは外側のスコープの変数にアクセスできる。
- var つき変数は、新規あつかい。
- var がない変数は、以前使っているはず。スコープ辿ってなければglobal扱い。(varなし変数=global変数ではない)
- global変数 = window.変数名
- コーディングされた位置とは関係なく、変数宣言はスコープの先頭で行われる。巻き上げ(hoisting)
- イディオムでよくやる
var foo = foo || {};
でhoistingを使っている。 - onevar practice (関数の先頭でvar一つで変数宣言、定義を行う)
- クロージャ = 関数 + 関数が作られたときの環境
a0 = 0; var a0 = 0; function xx() { console.log("** start xx"); var a1 = 1; function yy(a3) { console.log("** start yy"); console.log(a3); console.log(a2); console.log(a1); console.log(a0); var a2 = 2; // var a2; --> a2 = 2 // var a2 = 22; --> a2 = 22 console.log(a2); a1 = 11; console.log(a1); a4 = 4; console.log("** end yy"); } // yy(); yy(9); console.log(a1); console.log("** end xx"); } xx(); console.log(a4); // console.log(a1); ReferenceError: a1 is not defined