JavaScript中apply和call的使用

Javascript中使用apply方法轻松调用多参数函数
2009-09-18 上午 11:25

Javascript的每个Function对象中有一个apply方法:

function.apply([thisObj[,argArray]])

此外,还有另一个很极之相似方法:

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

他们的共同之处是,都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。”——摘自JScript5.5 .chm

她们的不同之处是,apply最多只能有两个参数——新this对象和一个数组,如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里面。而call则是直接的参数列表,对比如下:

function cat(_a, _b, _c, _d){
    alert(_a+ _b+ _c+ _d);
}
cat.apply(null,['mao~','hungry','said']);
cat.call(null,'mao~','full','happy');

Javascript就是个非常灵活的编程语言,上面两个函数为此功不可没;也因为她的灵活,所以她可以全部写进一个文件中。(Java就通常一个类class一个文件,一个接口interface也一个文件。在05年初,我还对javascript一窍不通,正要写下第一个“类”时,居然不知怎么下手,因为无法把“类”写到几个文件中 :D

有了这个方法,那我们就可以写一些“没有参数”的函数和轻松调用她们了:

var tdCel=function(){
  return "<td>"+Array.prototype.slice.apply(arguments).join("</td><td>")+"</td>";
};
var trRow=function(){
  return "<tr>"+Array.prototype.slice.apply(arguments).join("</tr><tr>")+"</tr>";
};
var thead=function(){
  var row=trRow("<th>"+Array.prototype.slice.apply(arguments).join("</th><th>")+"</th>");
  return "<thead>"+row+"</thead>";
};
var tbody=function(c){
  return "<tbody>"+c+"</tbody>";
};
var table=function(c){
  return "<table>"+c+"</table>";
};

关于Array.prototype.slice.apply(arguments),请看Array.prototype.slice.call自解。或者有朋友会认为上面几行建立table的方法不太妥当,用createElement方法更适合,但这里只是一个例子,或者说是展示了另一种建立table的手段。

//简单又随意建立单元格:
var _td=tdCel("English book");
var _td2=tdCel("English book","¥23.8","Xinhua bookshop");
//建立更多的单元格
var _tdArr=Ajax.parseXML(XMLNodes).toArray();
//_tdnArr=["English book","¥23.8","Xinhua bookshop","Tianhelu","at a sale","Mr.White",....]
var _tdN=tdCel.apply(null,_tdnArr);//this is the point!
...

另外,适合使用这个方法的还有下面两个函数: :)
Math.max([number1[, number2[. . . [,numberN]]]]);
Math.min([number1[, number2[. . . [,numberN]]]]);

Javascript是个很灵活的编程语言,编写起来非常有趣味;她基于对象,除了要救有高级的编程思想外,还要考虑代码数量对页面加载的影响,所以在适当的时候,又要解放思想,实事求是;农村包围城市;科学是第一生产力;时间就是金钱,效率就是生命。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值