Javascript 的call和apply函数

    先看一段代码:

var awardMedals, contenders, gold, rest, silver,
  __slice = [].slice;

gold = silver = rest = "unknown";

awardMedals = function() {
  var first, others, second;
  first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
  gold = first;
  silver = second;
  return rest = others;
};

contenders = ["Michael Phelps", "Liu Xiang", "Yao Ming", "Allyson Felix", "Shawn Johnson", "Roman Sebrle", "Guo Jingjing", "Tyson Gay", "Asafa Powell", "Usain Bolt"];

awardMedals.apply(null, contenders);

alert("Gold: " + gold);

alert("Silver: " + silver);

alert("The Field: " + rest);

    coffee 中的,js基础比较差,看了半个多小时勉强理解一点,记一下。

    js文档中call定义如下

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

 

    这里比较别扭的第一是awardMedals.apply这里,第一个参数是作为传入对象,来替代当前对象的,这里是null,看到网上讲如果为空就是global对象,在这里我觉得应该就是调用它的函数,也就是awardMedals对象。为什么这样周张呢,主要原因应该是第二个参数。有的朋友讲apply是吧所有参数合成为数组处理,我觉得这个理解略微片面,因为这个例子contenders本来就是个数组。我觉得应该是把第二个参数都当数组对象,这样的话contenders就不至于被作为一个argument被处理(这太绕了),类似a,(a,)的区别(python中的元组),对于不同的参数采取的处理方式不同,这样就用到了函数内部的__slice.call部分。这部分就比较好理解了,它调用arguments,即contenders,然后slice,不赘述。

    apply和call的区别也看出来了,就是第二个参数的区别,一个是当作一组参数来看,一个是当作一个参数看。

    只能理解到这里了,有什么不同看法,欢迎看官多多指点:)

posted @ 2013-07-16 16:16  孤独的小马哥  阅读(229)  评论(0)    收藏  举报