IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

スコープのメモ

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

stackoverflow.com