JavaScript中apply和call的使用

来源:互联网 发布:软件项目工时统计表 编辑:程序博客网 时间:2024/06/09 19:59
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是个很灵活的编程语言,编写起来非常有趣味;她基于对象,除了要救有高级的编程思想外,还要考虑代码数量对页面加载的影响,所以在适当的时候,又要解放思想,实事求是;农村包围城市;科学是第一生产力;时间就是金钱,效率就是生命。

原创粉丝点击