一天都被雜七雜八的bug和版本發布纏住,到了自由下來的時候已經是加班的鐘點了,看到了網友昨天的一個討論:
function
?buildList(list)?{
???? var ?result? = ?[];
???? for ?( var ?i? = ? 0 ;?i? < ?list.length;?i ++ )?{
???????? var ?item? = ?'item'? + ?list[i];
????????result.push(? function ()?{alert(item? + ?'?'? + ?list[i])}?);
????}
???? return ?result;
}
function ?testList()?{
???? var ?fnlist? = ?buildList([ 1 , 2 , 3 ]);
???? for ?( var ?j? = ? 0 ;?j? < ?fnlist.length;?j ++ )?{
????????fnlist[j]();
????}
}
testList();
???? var ?result? = ?[];
???? for ?( var ?i? = ? 0 ;?i? < ?list.length;?i ++ )?{
???????? var ?item? = ?'item'? + ?list[i];
????????result.push(? function ()?{alert(item? + ?'?'? + ?list[i])}?);
????}
???? return ?result;
}
function ?testList()?{
???? var ?fnlist? = ?buildList([ 1 , 2 , 3 ]);
???? for ?( var ?j? = ? 0 ;?j? < ?fnlist.length;?j ++ )?{
????????fnlist[j]();
????}
}
testList();
按照emu的理解,正確的做法應該是這樣:
function?buildList(list)?{
????var?result?=?[];
????for?(var?i?=?0;?i?<?list.length;?i++)?{
????????var?item?=?'item'?+?list[i];
????????result.push(?function(a,b){return?function(){alert(a?+?'?'?+?b)}}(item,?list[i])?);
????}
????return?result;
}
function?testList()?{
????var?fnlist?=?buildList([1,2,3]);
????for?(var?j?=?0;?j?<?fnlist.length;?j++)?{
????????fnlist[j]();
????}
}
testList();
????var?result?=?[];
????for?(var?i?=?0;?i?<?list.length;?i++)?{
????????var?item?=?'item'?+?list[i];
????????result.push(?function(a,b){return?function(){alert(a?+?'?'?+?b)}}(item,?list[i])?);
????}
????return?result;
}
function?testList()?{
????var?fnlist?=?buildList([1,2,3]);
????for?(var?j?=?0;?j?<?fnlist.length;?j++)?{
????????fnlist[j]();
????}
}
testList();
探討的時候又翻出來一篇舊帖子,發現自己當年居然還能這樣子玩array:
var?o={length:10,0:"a",1:"b",2:"c",5:"d"};???
alert(Array.prototype.join.call(Array.prototype.reverse.call(o)));
alert(Array.prototype.join.call(Array.prototype.reverse.call(o)));
猜測構造器是必要的,因此getElementsBy...方法返回的集合不能應該用上去:
var?o?=?document.getElementsByTagName("body");
alert(o.length)
alert(o[0])
alert(o.constructor)
alert(Array.prototype.join.call(Array.prototype.reverse.call(o)));
alert(o.length)
alert(o[0])
alert(o.constructor)
alert(Array.prototype.join.call(Array.prototype.reverse.call(o)));
關于call Array的各個方法的基本條件(有構造器、有length屬性、有0..n屬性)沒有文檔支持,完全是摸索出來的,佩服自己一個
