函数
函数,即方法.函数也是对象
函数的定义
-
定义方式有三种
-
函数声明语句
function 函数名([形参]){ } //调用:函数名([实参])
- 函数定义表达式
var 变量名/函数名 =function([形参]){ } //调用:变量名([实参])/函数名([实参]);
- Function构造函数
var 函数名=new function('参数1','参数2','函数的主体内容'); //调用:函数名([实参]); //构造函数的最后一个参数是函数体
-
注意
- js中的函数没有重写,同名的函数,会被后面的函数覆盖
- js中允许有不定数目的参数,后面接受arguments对象
-
函数名的提升
- JavaScript引擎将函数名视为同变量名,所以采用function
- 命令声明函数时,整个函数会像变量声明一样,被提升到代码头部
- 但是,如果采用赋值语句定义函数,JavaScript就会报错
fn4(); /*函数名的提升*/ function fn4() { console.log("函数名的提升。。。。"); } fn5(); var fn5 = function(){ console.log("函数名的提升..."); }
-
函数的参数,调用和return
参数
1. 函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结构,这种外部数据叫做参数,定义时的参数称为形参,调用时的参数称为实参.
2. 参数可以省略,那么对于形参为 undefined
3. 若函数形参同名(一般不会这么做),在使用时以最后一个值为准
4. 可以给参数默认值,当参数为特殊值时,可以赋予默认值
5. 参数为值传递,传递副本;引用传递是传递地址,操作的是同一个对象
函数的调用
-
常用调用方法: 函数名([实参]);
1. 存在返回值可以变量接受,若接受无返回值函数则为undefined
function fn8(){ console.log(this);//Window对象 } fn8();
- 函数调用模式
var fn9 = function() { console.log(this); // Window对象 return 1; } var f = fn9(); console.log(f);
- 方法调用模式
var obj = { uname:"zhangsan", uage:18, cats:["喵喵","猫猫"], sayHello:function() { console.log(this); // obj对象 console.log("你好呀~"); } }; console.log(obj.sayHello); obj.sayHello();
- call()和apply()
var obj2 = {}; function fn10(x,y) { console.log(x+y); console.log(this); } fn10(1,2); // Window对象 fn10.call(); // Window对象 fn10.call(obj2); // obj2 fn10.call(obj2,10,20); // obj2 fn10.apply(obj2,[100,200]); // obj2
- 注意:谁调用函数,this就指向谁
匿名函数立即调用
1. 匿名函数:function([参数]){};
2. 调用(function({形参}){})([实参]);
3. 在函数只被使用一次的情况下可以使用这种方法,简便省事
(function(a,b) {
console.log(a-b);
})(10,2);
return语句
1. 函数的执行可能会有返回值,需要使用return语句将结果返回,return语句不是必需的
2. 如果没有的话,该函数就不返回任何值,或者说返回 undefined
3. 作用:在没有返回值的方法中,用来结束方法
4. 有返回值的方法中,一个是用来结束方法,一个是将值带给调用者
argunments对象和函数的方法及属性
-
arguments对象可以得到函数的实参属性
-
函数名.name 得到函数名称
-
函数名.length 得到函数的形参数量
-
函数名.toString() 得到函数的源码
<script type="text/javascript"> function fn1 (a,b,c) { // arguments对象可以得到函数的实参数量 console.log(arguments.length); console.log("函数...."); console.log(arguments); } fn1(1,2); console.log(fn1.name);//fn1 console.log(fn1.length);//2 console.log(fn1.toString());//上方方法源码 </script>
函数的作用域
1. 函数作用域:全局(global variable)和局部(local variable)
1. 全局变量与局部变量同名问题
2. 在函数中定义变量时,若没有加var关键字,使用过之后自动变为全局变量
3. 变量作用域提升