1.变量提升
(1)变量提升就是var 声明的变量,无论在当前作用域的什么位置声明,都会将声明的变量提升到作用域的前面,例如:
console.log(a) //undefine
var a=10
相当于
var a
console.log(a)
a=10
所以声明只是将声明提升,值还在原来的位置
(2)在使用if判断中声明的var声明时,可能if 不被执行,但是里面的声明被提升
console.log(a) //undefine
a=10
if(false){
var a=20
}
console.log(a) //10
2.函数提升(函数提升的根本原因就是为了解决函数之间互相递归调用的情况)
函数分为函数声明和函数表达式(即函数字面量)
(1)函数声明会优于变量声明提升,在作用域的最前面。
console.log(a) //ƒ a(){}
var a=10 //变量声明
function a(){
} //函数声明
相当于
function a(){
}
var a
console.log(a)
a=10
(2)如果用函数表达式的形式,只提升了表达式的变量
console.log(a)//undefine
var a=10
var a=function(){}
相当于
var a
var a
console.log(a)
a=10
a=function(){}
3.let和var 的区别是
let 是局部作用域没有变量提升,var 是全局作用域存在变量提升,
console.log(a) //Cannot access 'a' before initialization
let a=10 //变量声明