[TOC]
# 函数
## 1.申明函数
### 1.1var申明函数
~~~
var go = function(){
console.log("hello world");
}
~~~
### 1.2function直接申明函数
~~~
function go(){
console.log("hello world");
}
~~~
### 1.3构造函数的方式申明函数(不推荐使用)
~~~
var go = new Function("a","console.log(a)");
~~~
## 2.构造函数的参数传递
> 在原型上定义一个方法,那么所有实例化的对象都共享这个方法
eg:
~~~
<script>
function person(name,age){
this.dsjh = name;//自定义属性
this.dsf = age;//自定义属性
}
/* 在原型上定义一个方法,那么所有实例化的对象都共享这个方法 */
person.prototype.sayname = function(){
console.log(this.dsjh);
}
var pi = new person("pikaqiu",20);
pi.sayname();
</script>
~~~
> js对传参不敏感
eg:
~~~
function go(a,b,c){
console.log(a);
console.log(b);
console.log(c);
}
go(1);//可以只传递一个参数
/* 函数的形参,是保存在函数对象的length属性中 */
console.log(go.legth);
~~~
> 函数内部有个arguments对象,它用来存放函数传入的参数,是一个类数组对象
eg:
~~~
function go(a,b,c){
console.log(a);
console.log(arguments[0]);
console.log(arguments[2]);
console.log(arguments[3]);
}
go(1,2,3);//1 2 3 undefined
~~~
## 3.重载
> 重载:函数根据传入的参数不同,动态决定调用哪种方法
> js不支持从在,但可以使用argument对象去模拟重载
>
eg:
~~~
function go(){
if(arguments.length == 1){
console.log(arguments[0]);
}else if(arguments.length == 2){
console.log(arguments[0]+","+arguments[1]);
}
}
go(1);//1
go(1,2);//1,2
go(1,2,3)//什么都没有
~~~
## 4.函数数据类型
* 基本类型 string,number,boolean,null,undefined (变量 存储位置:保存在栈区)
* 引用类型 Function,Array,Object (函数,数组,对象 存储位置:引用存放在栈区,实际对象保存在堆区)
> js函数中,基本类型只传值,应用类型既传值,也传地址
eg:
~~~
function go(){
console.log(1);
}
go.val = 2;
var see = go;
see.ind = 3;
console.log(see.val);//2
console.log(go.ind);//3
~~~
## 5.this关键字的指向(bind、call、apply的区别)
* call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用
* call(thisObj,params) apply(thisObj,[params]),这两者的区别便在于调用时书写方式不同
eg:
~~~
/* var wang = {
name:"wangyu"
}
var cheng = function(){
console.log(this.name);// wangyu
}.bind(wang);
cheng(); */
var cheng = {
name:"cheng",
}
var jiang = {
name:"jiang",
sayname(a,b){
console.log(this.name);
console.log(a+b);
}
}
jiang.sayname.call(cheng,1,2,3);// cheng 3
jiang.sayname.apply(cheng,[1,2]);// cheng 3
~~~