function B(x)
{
    return x==1;
}
var c=[1,2];
alert(B.apply(this,c));
alert(B(c));为什么第一个返回是TRUE,而第二个返回是FALSE?这二者有区别?我在B函数中加个ALERT(X)表明
第一个调用传过去的只是1,而第二个调用传过去的是整个数组,这是为什么?

解决方案 »

  1.   

    function B(x)
    {
        return x==1;
    }
    var c=[1,2];
    alert(B.call(this,c));//false
    alert(B(c));//false
      

  2.   

    比如说
    function A(a,b,c){}
    应该是A.apply(this,[a,b,c]);
    A.call(this, a, b, c);这样的调用方式,对参数的处理方式不同
      

  3.   

    alert(B.apply(c, [2, 1,0])); 这种方式传递时第二个参数为数组,确实是只传进去了数组中的第一个元素。
    难道传值的时候只拿了数组首地址上的元素???
    B(c) 传参的类型为object
     function B(x)
            {
                alert(x[0] + ":" + arguments[0][0]);
                return x == 1;
            }
            var c = [2, 1];
            alert(B.apply(this, c));//只传入了c[0],首地址上的元素???
            alert(B(c));//出入后为object
      

  4.   

    贴错,重来  function B(x)
            {
                alert(typeof arguments[0] + ":" + arguments[0]);
                return x == 1;
            }
            var c = [2, 1];
            alert(B.apply(this, c));//只传入了c[0],首地址上的元素???
            alert(B(c));//传入后类型为object
      

  5.   

    楼上的解释很正确。applay中第二个参数是一个参数数组。而直接用B(c)的方式就相当于使用的Function对象的B.call(this,c),这时,对应于B(x)只能够,x就变成了一个数组,所以x==1返回false
      

  6.   

    apply其实很方便,处理参数很灵活
      

  7.   


    apply方法
    应用某一对象的一个方法,用另一个对象替换当前对象。apply([thisObj[,argArray]])
    参数
    thisObj 
    可选项。将被用作当前对象的对象。 
    argArray 
    可选项。将被传递给该函数的参数数组。 
    说明
    如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。call 方法
    调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
    参数
    thisObj 
    可选项。将被用作当前对象的对象。 
    arg1, arg2, , argN 
    可选项。将被传递方法参数序列。 
    说明
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。也就是说
    B.apply(this, c) 将c作为参数传入,其中c[0]传给B的第一个参数,c[1]传给B的第二个参数,c[3].....
    B.call(this,c[0],c[1],c[3]......) 同上面一个效果
    对否?