帮忙分析个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
估计作者还是有特殊的考虑
Global site tag (gtag.js) - Google Analytics