第3回 変数の宣言とスコープ - @IT

参照型:
 配列(array)
 オブジェクト(object)
 関数(function)

ローカル変数は関数全体で有効である
ローカル変数は関数の先頭で宣言する

関数リテラルとFunctionコンストラクタにおけるスコープの違い

クロージャは一種の記憶域を提供する仕組み
クロージャを利用したトグル・ボタンの動作例
document.getElementById('btn').onclick = setButtonState();

function setButtonState() {
    var flag = false;
    var btn = document.getElementById('btn');

    return function() {
        flag = !flag;
        this.innerText = flag ? "有効" : "無効";
  };
}