什么是变量提升
变量提升是JavaScript中比较“奇怪”的现象,它允许在变量声明之前即被访问(仅存在于var声明变量),是一种JavaScript的缺陷。
console.log(num + '件') // undefined
var num = 10
1、当我们用var进行变量声明的时候,var会把声明的变量全部提前到当前作用域的最前面。
2、只提升声明,不提升赋值。
上一段代码运行时解析的过程:
var num;
console.log(num + '件')
num = 10;
如果在函数作用域中也同样遵循该规则:
function fn(){
console.log(num)
var num = 10
}
fn()
解析的结果
function fn(){
var num;
console.log(num)
num = 10;
}
fn()
注意:
1、let/const声明的变量在未声明即被访问时会报语法错误。
2、变量在var声明之前即被访问,变量的值为undefined。
3、let/const声明的变量不存在变量提升。
4、变量提升出现在相同作用域中。
5、实际开发中推荐先声明再访问变量。
函数提升
// 1、会把所有函数声明提升到当前作用域的最前面
// 2、只提升函数声明,不提升函数调用
fn()
function fn(){
console.log('函数提升')
}
// 正常运行,因为js函数并不是立即执行的,只有在运行时,通过声明找到需要运行的函数就可以。
函数表达式
// 如果我们使用函数表达式声明一个函数,必须先声明函数后调用,否则会报错。
fun() // 报错
fun = function(){
console.log('函数表达式')
}
注意:
1、函数提升能够使函数的声明调用更灵活。
2、函数表达式不存在提升的现象。
3、函数提升出现在相同作用域当中。