## 一、函数声明
a. 普通方式
~~~
function box(参数){
......
}
~~~
b. 变量方式
~~~
var box = function(参数){
......
}
~~~
c. function构造方法(不推荐)
~~~
var box = new Function('变量1','变量2','函数体');
~~~
由此可以看出,函数是对象,函数名是对象的指针
## 二、函数调用
`box();`
调用的时候可以执行2种操作:
1. `alert();`
2. 返回`return`
3. **作为值的函数**,函数可以作为参数传递给另一个函数
~~~
//函数作为 返回值 传递
function box(a,b){
return a+b;
}
function sum(c){
return c+10;
}
box(sum(20),50);
~~~
~~~
//函数作为 值 传递
function box(a,b){
return a(b);
}
function a(sum){
return sum+100;
}
var result = box(sum,10);
~~~
## 三、 函数内部属性
### 1. arguments
主要用来保存参数
注:参数以数组的形式存在arguments中,因此
`arguments.length` 参数长度
`arguments[0]` 获取某个参数
`arguments.callee` 获取自身函数名,递归函数内部会调用自身
~~~
function box(num){
if(num<1){
return 1;
}else{
return arguments.callee(num-1)*num; //return box(num-1)*num;
}
}
~~~
### 2.this
this 代表外面 "函数" 所处的作用域 对象,最高的作用域的是window
~~~
window.color='红色';
function say(){
alert(this.color);
}
say();
~~~
~~~
var box={
color:'red'
}
function say(){
alert(this.color);
}
box.say=say;
box.say();
~~~
## 四、函数属性和方法
函数是对象的一种,因此有对应的属性和方法
### 函数属性
`arguments.length`
~~~
//获取函数参数的个数
function box(a,b,c){}
alert(box.length);
~~~
### 函数方法
prototype原型方法
apply,call作用是设置函数内部this的值,在一个函数里面调用别的函数
这2个方法主要作用是改变作用域
#### apply() 参数是数组
~~~
//原函数
function box(a,b){
return a+b;
}
//用另一个函数调用这个函数,
function add(c,d){
//add冒充box函数的相加功能
return box.repply(this,[c,d]); //此时的this表示window下面的box
//下面写起来更方便
//rerurn bxo.repply(this,arguments);
}
//运行
add(5,10);
~~~
~~~
box.repply(this,arguments);
~~~
#### call() 参数一个一个传递
~~~
//方式一,有参数
box.call(this,n1,n2);
~~~
~~~
//方式二,无参数
box.call(作用域);
~~~
//改变作用域的例子,对象和方法无需任何耦合关系
~~~
var color='#000';
var box={
color:'#333'
}
function say(){
alert(this.color);
}
say.call(window);
say.call(this);
say.call(box);
~~~
![](https://box.kancloud.cn/f73a94028e9eb0ceb1da40f45418b6dc_934x503.png)