十一、函数
1.函数的概念
避免代码冗余,将相同功能的代码包装为函数。
函数:就是封装了一段可重复执行的代码块。
2.函数声明方式-两种
(1)调用函数关键字
function fn(形参名1,形参名2...){ //函数体 } fn()//调用
(2)利用函数表达式
- 同时此时函数并没有名字,fun只是他一个变量名
- 此时变量里面存的是函数
var fun = function(形参名1,形参名2...){ //函数体 } fun()//调用
3.函数使用
(1)声明函数--无参
- 声明函数关键字:funciton
- 函数名一般为动词,如:getNum()
- 声明时函数不会执行,调用时函数才会执行
function 函数名( ){ //函数体 }
(2)调用函数-无参
函数名(参数);
3.函数的封装
函数的封装:把一个或多个功能通过函数的方式封装起来,对外提供一个简单的接口。
4.函数的参数
参数可有有无,同时个数不限
【作用】:可支持函数传入不同的参数,执行不同计算。
(1)声明函数-带参
function 函数名(形参名1,形参名2....){ //函数体 }
(2)调用函数-带参
函数名 (实参1,实参2...)
4.1形参和实参
- 形参:形式上的参数---声明函数的小括号
- 实参:实际上的参数---函数调用时传入的参数
4.2形参和实参个数不匹配
1️⃣实参 = 形参,则输出结果正常。
2️⃣实参 > 形参,则参数个数看形参。
3️⃣实参<形参,则多余的形参默认为undefined,最终结果是NaN。
-
因而计算的结果是NaN(非数值形)
5.return
(1)函数返回值
使用return将函数执行的值返回给调用者。
function 函数名(){ //函数体 return 需要返回的结果; }
(2)终止函数
- 执行return后,该函数会被终止,所以return后的语句不再执行。
(3)❗注意事项
return只能返回一个值
1️⃣如果使用return返回两个值,会返回最后的值
- 所以返回多个值,可以用数组存储
如: function getResult(num1,num2){ return [num1+num2,num1-num2];//返回为数组 }
2️⃣函数没有return会返回undefined
6.break、continue、return的区别
- break:结束当前循环体
- continue:跳出本次循环,继续执行下次循环
- return:不仅退出循环,还能返回return的值,还可以结束当前函数
7.函数相互调用
- 函数可以相互调用,同时函数顺序不影响
如:
f1()调用了f2(),但是调用时,f2()还未执行。
十二、arguments的使用
-不确定形参个数时
【解决】:不确定传入的实参数量
【本质】:当前函数的内置对象,存储了传递过来的所有实参。
(即每个函数都有!!!!)
(1)arguments是一个伪数组
- 具有length属性
- 按索引方式储存数组
- 不具有数据的push,pop方法
function 函数名(不写形参){ //arguments包含所有传来的形参 //使用arguments来获取传入的形参 }
十三、作用域
变量在某个范围内起作用和效果
- 提升可靠性
- 减少命名冲突
(1)全局作用域
在整个script标签中,或单独js文件中
(2)局部作用域
在函数内部:该变量名只在函数内部起作用
(3)全局变量
1️⃣在全局作用域下的变量
2️⃣在函数内部未声明直接赋值的变量
- 全局变量,当浏览器关闭时才会销毁,比较占资源
- 全局变量,在任何位置都能用(但注意就近原则)
function test(){ num = 10;//这是全局变量,因为只赋值,未声明 }
(4)局部变量
1️⃣在局部作用域下的变量:函数中的
2️⃣函数的形参
- 局部变量,当程序执行完毕就会销毁
- 局部变量,只能在函数内使用
(5)块级作用域
js在es6时新增了块级作用域,原先并没有
- 即如今js中,{ }这类代码中的变量在任何位置都能使用
for(3>5){ var num = 10; } alert(num)//虽然将块代码中的变量,放在全局输出,但并不会报错,因为没有作用域。
十四、作用域链
两个函数嵌套时**,内部函数可以访问外部函数**的变量
十五、代码执行规则
JS代码是通过JavaScript解析器来执行的,具体分为两步:预解析和代码执行,执行规则如下:
1️⃣js引擎首先将所有var和function提升到当前作用域的最前面。----代码解析
2️⃣再按照代码书写顺序,从上往下执行---代码执行
(1)预解析
分为变量预解析(变量提升)和函数预解析(函数提升)
-
①变量提升就是将变量声明提升到当前作用域最前面,而不提升赋值操作。
- 当前作用域:全局作用域/局部作用域
/*1.报错*/ console.log(num); ------------------------------------------------------ /*2.num为undefined*/ console.log(num); var num = 10; 相当于: var num; console.log(num); num = 10; ------------------------------------------------------- /*4.在声明前调用报错*/ fun();//报错 var num = function(){ console.log(22); } 相当于: var num; fun(); num = function(){ console.log(22); }
②函数提升就是将函数声明提到作用域最前面,不调用函数
/*3.在声明前、后,调用都可*/ fn()//调用成功 输出11 function fn(){ console.log(11); } fn();//调用成功 输出11 相当于: function fn(){ console.log(11); } fn(); fn();
(2)代码解析
预解析后,按从上到下的顺序执行。
(3)案例
- 最终结果:undefined,因为函数里和函数外的变量都要提升作用域,但不赋值