## 函数的声明
1.普通声明
~~~
function box(a,b){
.......
}
~~~
2.变量初始化函数
~~~
var box =function(a,b){
...........
}
~~~
3.使用Function构造函数,不推荐
`var box =new Function('a','b','return a+b');`
## 函数的传递
* 作为函数的返回值来传递
`box(sum(10),20);`
* 作为函数本身传递
~~~
function box(a, b) {
return sum(b);
}
function sum(c) {
return c + 20;
}
alert(box(sum, 40));
~~~
## 函数内部有2个对象
* arguments
主要用途保存函数参数,arguments的属性callee,是一个指针,指向arguments所属的函数
~~~
function box(a){
if(a<=1){
return 1;
}else{
return a*arguments.callee(a-1); //arguments.callee()代表函数自身
}
}
alert(box(10));
~~~
* this
代表函数所处的作用域对象,全局作用域下this代表window
## 函数的属性和方法
函数也是对象,也有属性和方法
函数2个属性:
* **length**
box.length表示函数参数的个数
* **prototype**
prototype有2个方法:主要作用是**改变作用域**,使对象和函数不发生耦合关系
* apply(); //用一个函数冒充另一个函数,执行这个函数的内容
* call(); //和apply方法一样,只是参数的写法不同,不传参,call更方便
~~~
function box(a,b){
return a+b;
}
//sum冒充box,执行相加功能
function sum(a,b){
return box.apply(this,[a,b]); //this表示box在window下面,[]里面是box的参数
}
//另一种方法
function sum2(a,b){
return box.apply(this,arguments); //arguments当数组传递
}
//call方法
function sum3(a,b){
return box.call(this,a,b); //arguments当数组传递
}
alert(sum(10,20));
alert(sum2(10,20));
alert(sum3(10,20));
~~~
//改变作用域实例
~~~
color="红色";
box={
color:"蓝色"
}
function say(){
alert(this.color);
}
say.call(this); //红色
say.call(box); //蓝色
~~~