一、声明提前(hoist)
在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地
二、三种创建函数的方式
1、声明方式创建函数--会被声明提前
function 函数名(形参1,形参2,形参3。。。){
函数体
return 返回值
}
这一段会提到当前作用域顶端
2、赋值方式
var fun=function(形参1,形参2,形参3。。。){
函数体
return 返回值
}
只会把var fun提前
三、重载(overload)
相同函数名,不同形式参数列表的多个函数,在调用时,可自动根据传入实际参数的不同,选择对应的函数调用,减少函数名的数量,减轻维护负担
应用场合:一件事,可能根据传入的参数不同,执行不同的操作
js默认不支持重载,不允许多个同名函数同时存在,如果存在,最后一个函数会覆盖之前所有
解决办法:arguments对象
arguments对象:每个函数内自动创建,准备接收所有传入函数的实际参数的类数组对象
自动创建:
接收所有的实际参数:
类数组对象:长的像数组的对象
数组:下标 length 遍历
四、匿名函数
定义函数,不写名的函数
定义:如果一个函数只使用一次,不会反复使用,就不起函数名
为什么:节约内存,使用一次后,自动释放
场景:
(1)回调函数:自己定义的函数,自己不调用,而是传给其他对象或者函数,被别人调用
(2)匿名函数自调:定义函数后,立刻自己调用自己
五、作用域(scope)
全局和局部
js只有两种作用域,window的作用域和函数的作用域,for,while等均不是作用域
六、闭包
闭包,重用变量又保护变量不被篡改的编程方式,内部函数调用内部函数
1、步骤:
(1)、外层函数包裹内层函数和受保护的变量
(2)、外层函数将内层函数return到外部
(3)、调用外层函数,获得内层函数对象,保存在外部变量中