什么是函数?
只要一段代码可能被反复使用时,都要保存在一个函数中,然后反复调用
如何定义函数?(三种方式)
1.声明函数创建函数
定义:
function 函数名 ( 形参列表 ) {
//要反复使用的代码片段
return 返回值;
}
使用:
var 变量 = 函数名( 实参值列表 )
注:
给函数中的形参列表传值,等效于赋值 (var)
如果有返回值(return),则将函数执行的结果返回到函数外部,保存到 = 左边的变量里
问题:
用声明方式创建的函数,最大的问题就是会被声明提前
解决:
用赋值方式创建函数
什么是声明提前?(hoist)
在程序开始执行前,都是先在整段程序中 查找var声明的变量和 function声明的函 数,将他们的定义提前到当前作用域的顶部集中创建。赋值留在原地。
因为声明提前 function fun()声明的函数被提提前 会在函数执行前:
function fun( ){ console.log(1) }
function fun( ){ console.log(2) }
由于在 html js css 中都是 解释执行 那么后边的同名的内容会覆盖前边的function 所以只剩一个function fun( ){ console.log(2) }
那么 fun() fun() 执行结果都是 2
2.赋值函数创建函数 (优先选择)
定义:
var 函数名 = function(形参列表){
函数体;
return 返回值;
}
揭示了函数的本质:
函数名 其实是一个很普通的变量名而已 (例如:var a = 10)
函数的本质是内存中一个引用类型的对象
函数在内存中 有一个唯一的地址值,来标识函数对象存储的位置
函数名中保存的其实不是函数本事 ,而是保存的函数地址值
调用函数时,其实js引擎先获得函数名变量中的地址 ------>再根据地址找到内存中的
函数对象------>在执行函数对象中保存的代码片段
使用:
var 变量 = 函数名( 实参值列表 )
注:
不会让函数声明提前 ,今后优先选择赋值方式创建函数
因为 根据 =左边为声明变量 =右边为赋值
按声明提前的原理 var声明的变量会被提前到作用域顶部 但是赋值在原地
var fun //声明提前了
var fun //声明提前了 因为之前已经有过var fun 变量了 此时的var fun 什么也不做
fun = function () { console.log(1)} //赋值
fun(); //1
fun = function () { console.log(2)}
fun(); //2
3.匿名函数
什么是匿名函数?
定义函数时,不指定函数名的函数。
使用情景:
所有的回调函数都要定义为匿名函数;
匿名函数自调
注:匿名函数节约内存;避免产生全局变量,造成全局污染
什么是回调函数?
回调函数:自己定义了函数,但是不由自己调用,而是交给另一个函数,由另一个函数 按需自动调用
例如:arr.sort( function(a,b){ return a-b }) 自己定义的函数 由arr主函数来自动调用的
为什么回调函数都要定义为匿名函数?为了节约内存!!!