创建函数的三种方式:
1.function 函数名(形参列表){函数体;return 返回值} //会将声明提前
例如:function fun(a,b) {}
2.var 函数名 = function(形参列表){函数体;return 返回值}//不会被声明提前
例如:var fun = function(a,b){}
3.var 函数名=new Function('形参'1,'形参2'...,'函数体;return返回值')
例如:var fun = new Function(a,b...,' ; ')
函数本质:
1. 函数也是一个对象,对象中保存着函数的函数体代码
2.函数名只是一个普通的变量,函数名通过函数对象地址,引用着函数对象
3.function在底层等效于new Function(), function 函数名(){.....}和var 函数名 = function(){}在底层都被翻译为 var 函数名 = new Function()
重载:
一件事,根据传入不同的参数值,动态执行不同的逻辑时,都用重载function
一个函数名(不写形参变量){
//arguments对象自动接主所有实参值
if(arguments.length == 0){
执行一种逻辑
}else{
执行另一种逻辑
}
其中arguments是类数组对象:
和数组相比:相同点:都有下标,length属性,也可以for循环遍历
不同点:不是数组类型,无法使用数组的那些函数
作用域和作用域链:
1.作用域:(1)全局作用域:window,保存全局变量(优点:可重用,缺点:随处可用, 污染 全局)
(2)函数作用域:保存局部变量
局部变量包括两种:函数中var出的变量和形参变量
优点:仅函数内可用,不会被污染
缺点:不可重用
(3)函数作用域对象原理:
i.每个函数定义时都自带好友列表,好友列表里2个格子,一个是空,一 个是引用window
ii.调用函数时临时创建函数作用域对象保存函数局部变量。并将函数作用 域对象的地址保存到函数好友列表中离自己近的格子里。
iii.函数执行过程中按就近原则先在自己的函数作用域对象中找局部变量 使用。如果找不到,才被迫去全局window中找变量使用
iv. 函数调用后,好友列表中离自己近的格子清空,导致函数作用域对象 以及内部的局部变量被释放!——所以局部变量不可重用!
b. 作用域链: 保存一个函数所有可用的作用域对象的链式结构(好友列表) 学名就叫作用域链。
1). 作用域链保存着一个函数可用的所有变量
2). 作用域链控制着变量的使用顺序。先局部后全局。