var outer = 'outer';
var later;
function outerFunc() {
var inner=0;
function innerFunc(){
document.write(outer+'<br/>');
document.write(inner+'<br/>');
inner++;
}
innerFunc();
later=innerFunc; // クロージャを作る
}
// クロージャを持たないのでinnerの値は2回とも0になる
outerFunc();
outerFunc();
// クロージャを持つのでinnerの参照が保持され、インクリメントされていく
later();
later();
// グローバル変数の状態はやはり直に影響を受ける
outer = 'outer2';
later();
実行結果
outer
0
outer
0 ←クロージャが無いので状態が保持されない
outer
1 ←クロージャ内で状態が保持されるためインクリメントされる
outer
2
outer2 ←グローバル変数の影響はクロージャ内でも受ける
3