n2s アーカイブス

「 【えぬ】〜Theme of えぬ〜 にまつわるはてダ」のアーカイブです。気が向いたら復活するかもしれません。

クロージャ関連の挙動について

var a=[100, 200, 300];
var b=[];
var i;
for(i=0; i <= 2; i++){
  b[i] = function(){ alert(a[i]); } /* 想定しない挙動 */
}

/* ※1 */
var j;
for(j=0; j <= 2; j++){
  b[j]();
}

/* ※2 */
for(i=0; i <= 2; i++){
  b[i]();
}

↑を実行すると「undefined」が3回(ここまで※1)、次いで「100」「200」「300」と(ここまで※2)ポップアップされる。
さらに

b[0]();
i=1;
b[0]();

を実行すると「undefined」「200」とポップアップされる。
うーん…
ちなみに↓のように直すとうまくいく。

var a=[100, 200, 300];
var b=[];
var i;
for(i=0; i <= 2; i++){
  b[i] = (function(x){
    return function(){ alert(a[x]); };
  })(i); /* 想定したとおりの挙動 */
}
/* ※3 */
var j;
for(j=0; j <= 2; j++){
  b[j]();
}

/* ※4 */
for(i=0; i <= 2; i++){
  b[i]();
}

/* ※5 */
b[0]();
i=1;
b[0]();

このときは
「100」「200」「300」(ここまで※3)「100」「200」「300」(ここまで※4)「100」「100」(ここまで※5)
の順にポップアップされる。