Chinaunix首页 | 论坛 | 博客
  • 博客访问: 203134
  • 博文数量: 73
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 750
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-13 18:32
文章分类

全部博文(73)

文章存档

2009年(1)

2008年(72)

我的朋友

分类: 系统运维

2008-04-05 14:18:44

1,定义一个函数的三种方式
  function f(x){return x*x}//function语句
  //Function ctor在js1.1版本及以后有效
  var func=new Function("x","return x*x;")
  //js1.2版本及以后有效
  var func=function(x){return x*x;}//函数直接量
 
  a[0]=function(x){return x*x;}//定义函数并保存
  //定义一个函数并传递给另一个函数。
  a.sort(function(a,b){return a-b;})
  //定义一个函数并调用
  var tensquared=(function(x){return x*x;})(10)

2,函数就是数据
  function add(x,y){return x+y;}
  function subtract(x,y){return x-y;}
  function multiply(x,y){return x*y;}
  function divide(x,y){return x/y;}

  function operate(operator,operand1,operand2){
    return operator(operand1,operand2);
  }
  var i=operate(add,operate(add,2,3),
    operate(multiply,3,4));
 
3,arguments变量
  arguments表示函数执行时接受的实际参数的数组,因为js的函数调用是不限制传入参数的。arguments数组为实现变参函数提供了可能:
  function max(){
    var max=Number.NEGATIVE_INFINITY;
    for(var i=0;i      if(arguments[i]>max)max=arguments[i];
    }
    return max;
  }
  max(1,2,45,43,1567,0);
 
  arguments的callee属性
  callee属性引用了当前正在执行的函数,这在匿名函数中实现递归是很有用的。
  function(x){
    if(x>1)return x*arguments.callee(x-1);
    return x;
  }
  arguments的caller属性
  实际参数对象的caller属性引用的是当前函数被调用的调用环境,arguments.caller引用的不是调用当前函数的那个函数,而是调用哪个当前函数的函数的实际参数对象。所以要引用调用函数必须使用argument.caller.callee.慎用arguments.caller属性。
  实例可以参见jc 7.4
 
3,Function的属性和方法
  1,length和arity属性
    length和arity 表示的是函数期望的参数个数,即函数在声明时使用的参数个数。arity是为了避免与数组的length属性发生冲突而引入的,意义与length属性相同。
   
function checkargs(){
    var expected=arguments.caller.callee.arity;
    var passed=arguments.caller.length;
    if(passed!=expected){
        var funcname=arguemnts.caller.callee.toString().
          match(/function (\w*)/)[1];
        alert("WARNING:\n"+
             funcname+"()"+" was invoked with wrong number of arguments!\n"
        );
  }
}
function f(x,y,z){checkargs();return x+y+z;}
f(1,2);

  prototype属性,留待以后讨论
  2,apply,call方法
    apply方法允许你调用函数就像该函数是某个对象的方法一样。
    f.apply(o,[1,2]);
    等价于:
    o.m=f;
    o.m([1,2])
    delete o.m;
  call方法的行为与apply类型,只不过掺入的是参数列表而不是参数数组。
    f.apply(o.[1,2])等价于f.call(o,1,2);


阅读(3304) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~