一天都被雜七雜八的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();
按照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();
探討的時候又翻出來一篇舊帖子,發現自己當年居然還能這樣子玩array:
var?o={length:10,0:"a",1:"b",2:"c",5:"d"};???
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)));
關于call Array的各個方法的基本條件(有構造器、有length屬性、有0..n屬性)沒有文檔支持,完全是摸索出來的,佩服自己一個

。