一天都被杂七杂八的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属性)没有文档支持,完全是摸索出来的,佩服自己一个
。