一、变量提升
只有var存在变量提升。变量提升就是将变量提至当前作用域的最前面,只提升声明,不提升赋值。
console.log(n) // undefined,不会报错
var n = 10
等价于
var n
console.log(n) // undefined,不会报错
n = 10
因为n是全局变量,所以将变量n的声明提至最前方,在定义之前就可以访问到。
二、函数提升
函数提升就是将当前函数的声明提升到当前作用域的最前方,只提升声明,不提升调用。
<script>
fun();
function fun(){
console.log("函数提升");
}
</script>
注意:函数表达式不存在提升现象。
var a = 4
function fn () {
console.log(a) // undefined
var a = 5
}
fn()
函数提升优先级高于变量提升。
function a() {}
var a;
console.log(typeof a) // function
函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖。
<script>
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
</script>