变量提升是javascript中比较'奇怪'现象,它允许在变量声明之前被访问(仅存var声明变量)
注意:
1、变量在 未声明被访问时会报语法错误
2、变量var声明之前被访问,变量的值是undefined
3、let、const声明变量不存在变量声明提升
4、变量提升出现在相同作用域中
5、实际开发中推荐先声明在访问变量
<script>
console.log(arr);//undefined
var arr=[1,2,3]
console.log(str)//报错
let str='123456';
</script>
说明:
js初学者经常花很长事件才能习惯变量提升,还经常出现一些意想不到的bug,正因为如此,Es6引入了块级作用域,用let或者const声明变量,让代码写法更加规范和人性化。
用关键字var才存在变量声明提升。
变量声明提升的流程:
先把var变量提升到当前作用域最前面
只提升变量声明,不提升变量的值
然后依次执行代码
const和let不存在变量提升
函数声明提升
1、会把所有函数声明提升到当前作用域最前面
2、只提升函数声明,提升函数调用
<script>
fn()
function fn(){
console.log(111)
}
fn2()
var fn2=function (){
console.log(22)
}
//函数表达式,必须先声明和赋值,后调用,否则报错
</script>
总结:
1、函数提升能够使函数的声明调用更灵活
2、函数表达式不存在提升
3、函数提升出现在相同作用域当中