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的区别也看出来了,就是第二个参数的区别,一个是当作一组参数来看,一个是当作一个参数看。
只能理解到这里了,有什么不同看法,欢迎看官多多指点:)

浙公网安备 33010602011771号