1.函数类型提升
无论函数定义在哪里,都最先被解析。所以函数定义的位置不影响函数调用
2.函数表达式
将匿名函数赋给变量,变量名就是函数名。
但没有函数提升的特性,即只能在定义之后的语句被调用
fun(1,2) //报错 Cannot access 'fun' before initialization
const fun = function(m,n){
return m+n;
}
fun(10,23)
3.函数的默认形参
function sum(a=100,b=10){
return a+b;
}
console.log(sum());
console.log(sum(10,30));
4.闭包函数
一般来说,外部无法访问到内部作用域定义的变量。为了绕过这种限制,在函数内部返回另一个函数(闭包函数)。
function fun1(){
let local_A="局部变量 1"
let local_B="局部变量 2"
return function fun2(){
console.log(local_A,local_B);
}
}
const p = fun1(); // 返回函数fun2()
p() // 局部变量 1 局部变量 2
内部的闭包函数若未被执行完,主调函数即使执行完也不会被销毁,主调函数的内部内容也将保留一阵子。
5.箭头函数
使用箭头函数不仅仅为了简单,而是为了箭头函数的this属性
普通函数的this,主体是调用this的函数
箭头函数的this,主体是this所处的位置
const cat = {
name:"miaomiao",
sayName(){
setInterval(function(){
console.log(this.name);
},1000)
}
}
cat.sayName() //开始每隔一秒执行一次打印,但什么都没输出。
//因为setInterval()是window对象的方法,
//此时this的主体是window对象。window没有name这个属性
const dog = {
name:"wangwang",
sayName(){
setInterval(()=>{
console.log(this.name); //箭头函数定义在sayNmae()中, this 的主体是dog对象的sayName()。正确打印 name 属性
},1000)
}
}
dog.sayName() //this的主体是 dog,可以正确打印