在ECMAScript中,Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。
1、三种函数声明的方式
1》第一种:普通方式声明函数
1 function box (num1,num2){ 2 return num1+num2; 3 }
2》第二种:使用变量初始化的方式:
1 var box =function(num1,num2){ 2 return num1+num2; 3 };
3》第三种:使用Function构造函数的方式
1 var box =new Function("num1",'num2','return num1+num2');
总结:第三种方式不推荐使用:因为要解析两次代码:第一次:解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串;所以影响性能。但是我们能从这种语法理解“函数是对象,函数名是指针”这个概念
2、作为值的函数
ECMAScript中的函数本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以传递参数一样把一个函数传递进另一个函数,而且也可以将一个函数作为另一个函数的结果返回。类似于 c# 中的 委托,令方法 像参数一样传递到另一个方法中。
1 function box(sum,num){//将函数 以参数的 形式 传递进 另一个函数 2 return sum(num); //将函数作为返回值 进行返回 3 } 4 5 function sum(num){ 6 return num+10; 7 } 8 alert(box(sum,10));//20
3、函数内部的属性
在函数内部,有两个特殊的对象:arguments和this。arguments 是一个 类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
arguments属性的使用:
1 function box(){ 2 alert(arguments.length); 3 for(var i=0;i<arguments.length;i++){ 4 alert(arguments[i]); //取到每一个传进来的参数 5 } 6 } 7 8 box(1,2,3,4);
callee属性(是arguments的属性)
1 //使用arguments.callee代替 自己 2 function sum(num){ 3 if(num<=1){ 4 return 1; 5 } 6 else{ 7 return num * arguments.callee(num-1); 8 } 9 } 10 alert(sum(4));//24
this对象:
和c#中的this大致相似。this对象引用的是函数以执行操作的对象,或者说函数调用语句所处的那个作用域。
PS:当在全局作用域中调用函数时,this对象引用的就是window。
1 var color='红色'; 2 alert(window.color);//红色 只要是全局作用域内的对象 就是 window下 3 alert(this.color)//红色 this位于全局作用域下,this引用的就是window对象 4 alert(color);//红色 可以省略 window直接输出 5 6 window.color='蓝色'; //等价于:var color='蓝色'; 7 alert(this.color);//蓝色 8 alert(color);//蓝色