🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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 ~~~