arguments对象的高级用法 - jarry - 我想去非洲
js实现消息滚动显示效果
js中数字字面量的constructor

arguments对象的高级用法

jarry posted @ 2009年8月13日 05:46 in javascript , 1495 阅读

利用javascript函数的arguments对象,结合闭包的特性创建优雅的函数。

废话不多说,直接看例子:

定制执行次数和执行时间间隔的函数

  1. function repeat(fn, times, delay) {
  2.   return function() {
  3.     if(times-- > 0) {
  4.       fn.apply(null, arguments);
  5.       var args = Array.prototype.slice.call(arguments);
  6.       var self = arguments.callee;
  7.       setTimeout(function(){self.apply(null,args)}, delay);
  8.     }
  9.   };
  10. }
  11. function showMsg(s){
  12.     alert(s);
  13. }

 调用方式:

  1. var someMsg = repeat(showMsg, 3, 2000); someMsg("hello jarry!");

将会每隔两秒钟弹出一个提示框,一共弹出三次,程序的关键在fn.apply(null, arguments);和var args = Array.prototype.slice.call(arguments);两行,这两行分别负责将hello jarry!参数传递给showMsg函数和保存当前参数,以便在setTimeout函数中能够访问到它们,这里利用的是函数的闭包特性。

匿名函数的递归:

  1. (function (n, j){
  2.     j = j || 1;
  3.     return n == 0 ? j : arguments.callee(n-1, j*n);
  4. })(6);//求6的阶乘

 arguments.callee属性保存了当前被调用函数的引用,所以能够利用它实现匿名函数的调用。

创建预置参数的函数:

  1. function makeFunc() {
  2.   var args = Array.prototype.slice.call(arguments);
  3.   var func = args.shift();
  4.   return function() {
  5.       return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
  6.   };
  7. }
这个名为 makeFunc 的函数,它根据你提供的函数名称以及其他任意数目的参数,然后返回个匿名函数。此匿名函数被调用时,原先被传进来的参数与当前传递的参数进行合并,然后交给指定的函数运行并返回其返回值。

比如我们这样调用

  1. function hello(s,m){
  2.     alert(s+m)
  3. }
  4.  
  5. var hi = makeFunc(hello, "hello! ");
  6. hi("jarry!");//“hello! jarry!”
  7. hi("qf!");//“hello! qf!”
  8. hi("ggk!");//“hello! ggk!”

 

(程序可自由转载,但是请注明出处)

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter