## 函數的聲明
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); //藍色
~~~