帮忙分析个each方法
lucane
2010-09-20
在百度页面上抠下来的each方法如下:
each=function(f,a) { if(f) { if(f.length==undefined) { for(var b in f) { a.call(f[b],f[b],b) } } else { for(var c=0,d=f.length;c<d;c++) { a.call(f[c],f[c],c) } } } return f }; 我有几个疑问? 1、把有length属性的对象和没有length属性的对象分开仅仅是出于效率因素吗? 2、a.call(f[b],f[b],b) call方法最后跟的f[b]和b是传到a方法的参数吗? 为什么要传这两个参数 谢谢大家 |
|
chroya
2010-09-22
1.有length的是数组类型,没有length的是对象类型,取值的方式不同,所以要分开
2.后面的f[b]和b是传到a的参数,至于为什么,那跟函数a有关,相信你看看传递进来的a函数的实现就明白了。 |
|
rainsilence
2010-09-23
几乎同意ls第一点
1.length是数组,如果length==undefined代表不是数组,那么循环里面的每个属性。数组的话,他本身就是对象。也有length之类的属性,当然以这些不能作为循环了。而只能对数组里的元素进行循环。 2.的确是传到a的参数。但是不是跟函数a有关。而是将每一项传入a,然后再把整个数组传入a。这样在传入的a中就可以取到这两个参数。 这里还有一个javascript的基本知识 function a() {}; a(1, 2, 3); 这样的调用是成立的 如果function a(b) {} a(1, 2, 3); 那么只有1可以被取到。 |
|
rainsilence
2010-09-23
哦,关于第2点,看错了,先将每一项传入a,再把index传入a。
|
|
MarJack
2010-09-23
rainsilence 写道 几乎同意ls第一点
1.length是数组,如果length==undefined代表不是数组,那么循环里面的每个属性。数组的话,他本身就是对象。也有length之类的属性,当然以这些不能作为循环了。而只能对数组里的元素进行循环。 2.的确是传到a的参数。但是不是跟函数a有关。而是将每一项传入a,然后再把整个数组传入a。这样在传入的a中就可以取到这两个参数。 这里还有一个javascript的基本知识 function a() {}; a(1, 2, 3); 这样的调用是成立的 如果function a(b) {} a(1, 2, 3); 那么只有1可以被取到。 除非使用arguments; 此时, arguments.length == 3; arguments[0] == 1; arguments[1] == 2; arguments[2] == 3; |
|
lucane
2010-09-25
不好意思,放假几天家里面上网慢,没办法回复
感谢各位的回答 @:chroya String Array arguments Function 都包含有length属性 我现在想知道这个方法主要对那些类型的对象进行遍历操作 如果只是对数组的话,我觉得没有必要判断length 如果是对String的,这样的遍历操作不是在所有浏览器下都可以正常出结果的吧 或许是为了自定义的一些对象的考虑? 疑问2我明白了,只是这样一种写法,让回调函数最多可以传两个可用的参数 |
|
lucane
2010-09-25
@:rainsilence
<script> var arrs = [1,2,3]; for(var i in arrs) {alert(i + "_" + arrs[i])}; </script> foreach遍历是不会将数组的length遍历出来的吧 |
|
chroya
2010-09-25
如你问题中的each对象,他的length属性就是undefined的
|
|
rainsilence
2010-09-30
@:lz
的确如你所说,Array的for in只会循环元素,而不涉及到属性 话说这个each函数的动机有点奇怪 如果是单纯的Object,真的有必要对所有属性循环?真的有什么处理是要对所有属性处理的?而且是只能取得而不能修改属性。貌似意义不是很大 只有Array,才有可能有这样一个循环的逻辑 查询了下jquery的源码,他也只有下面那个循环。 |
|
lucane
2010-09-30
@:rainsilence
估计作者还是有特殊的考虑 |