emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks

一天都被杂七杂八的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属性)没有文档支持,完全是摸索出来的,佩服自己一个
posted on 2006-09-20 22:04 emu 阅读(1221) 评论(2)  编辑  收藏

评论

# re: 居然抽时间玩了一下技术 2008-09-02 12:54 Relucent
很强我是说
“alert(Array.prototype.join.call(Array.prototype.reverse.call(o)));”
  回复  更多评论
  

# re: 居然抽时间玩了一下技术 2008-09-02 12:56 Relucent
和“alert(Array.prototype.slice.call(o).join());”应该是同样效果。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: