函数
函数的概念:
在JS中,函数可以理解为在一段程序(页面)中多次出现的代码端 , 封装起来的盒子
函数的使用
1.定义函数(创建一个盒子)
1.1 声明式定义
语法:function fn (内部填写参数){
内部填写函数调用时要执行的代码段
}
function:关键字->表明后续的是一段西数
fn:函数的名字->将来函数调用的时候需要用到,函数名自定义
1.2赋值式定义函数
var fn2 = function () {
console.log('我是 fn2 函数")
}
声明式与赋值式的区别:
1).写法不同
2).调用上略有不同
声明式定义的函数,可以在函数定义前去调用
题值式定义函数,不能再函数定义前去调历,其本身就是声明一个变量,然后给他赋值一个函数
再JS中,如果再定义变量之前使用变量的话,那么变量的值为_undefined ( * 变量提升 * )
2.函数的调用(使用盒子的代码)
不管是声明式还是赋值式定义的函数,调用方式都是一样的
调用语法:函数名() / 变量名()
函数的参数
1.参数的作用?
如果一个函数没有书写参数,那么这个函数的功能相对来说比较单一;如果书写参数,可以是我们的函数使用更加灵活.
2.参数书写方式:
1).function后的小括号内书写的参数我们叫做“形参"!!
形参的作用,书写之后,相当于在函数内部创建了一个变量,变量实际的值由"实参"传递
2).函数名后的小括号内书写的参数我们叫做“实参"!!!
实参的作用:将自身的值,按照一一对应的关系,传递给形参
函数的参数
3.形参和实参两个的数量,要一一对应:
1).形参的数量如果大于实参:
那么会将实参按照顺序一一传递给对应的形参,多出来的形参,相当于变量只定义没赋值,所以他们的值是undefined
2).实参数量如果大于形参:
那么会将实参按照顺序一一传递给对应的形参,多出来的实参无法在函数内部通过函数的方法调用
4.函数参数的默认值
函数再创建形参的时候,默认给一个值,将来在调用函数的时候,
如果没有传递那么这个形参的值也不会是 undefined而是给的默认值
如果传递了对应的值,那么形参的值是实参传递进来的值执行,否则按照默认值来运行
函数的返回值
即函数的执行结果
JS规定:在函数内部创建或者定义的变量,只能在函数内部使用(作用域详细讲解)
我们如果想在函数外部得到函数内部的某一个值,或者运算结果,我们可以通过return 这个关键字来帮我们完成
return 具有中断函数的能力
所以一殷来说我们将它放在函数的尾部
函数的预解析(面试)
预解析的一个表现 就是声明式函数在定义前可以被调用
定义:
JS在执行代码的时候,会有一个所谓的解析阶段
解析阶段,做了一件事,就是函数提升,就是将声明式函数的定义,提升到当前作用域的最顶端
作用域的最顶端:
暂时理解为当前页面的最开始的位置
作用域
定义:就是变量可以起作用的范围
分类:
(1).全局作用域(直接在script内书写的代码)
再此作用域创建的变量,,我们四做全局变量,在当前script标签内的哪里都能使用
在JS中,全局作用域中有一个提前给我们准备好的 对象,这个对象叫做window
我们创建的全局变量,会被自动添加到window对象中
(2).局部作用域(在Js 中,只有函数能够创建局部作用域)
在此作用域创建的变量,只能在当前作用域使用,超出这个作用域(也就是在函数外边)去使用,就会找不到变量
作用域链
定义:就是在访问一个变量时,如果当前作用域没有,就会去自己的父亲作用域,也就是上一层作用域内查找,如果找到就直接使用,如果没有找到继续向上层查找,直到查找到最项层的全局作用域,如果找到了直接使用,如果没找到报错提示变量不存在(未定义)
我们将这个一层一层向上查找的规律,叫做作用域链
赋值规则:
在给变量赋值的时候,首先会去当前作用域查找该变量,如果有直接赋值,并停止查找
如果没有,会去自己的父级查找,在父级找到直接修改值然后停止查找。如果没有继续向自己的父级查找,直到找到全局作用域
在全局作用域内,找到直接赋值修改他的值,如果没有找到,那么会在全局作用域创建一个变量,并赋值
递归函数
定义:本质上还是一个函数,当一个函数在一个函数的内部调用了自
身,那么就算是一个递归函数,(只不过有点小缺陷)