变量提升是面试中非常常见的一个问题
比如 var 和 let 的区别是什么?
答案之一就有 let 不会变量提升
1.概念
最基础的概念大家都知道
console.log(a);
var a = 1;
// 输出 undefined
在代码中 使用 var 来声明变量的时候,会提到当前作用域的顶端,而赋值操作在原处不变
上面的两行代码相当于
var a;
console.log(a);
a = 1;
var a声明向上提升,a=1赋值留在原处
2.多个script的情况
<script>
console.log(a)
</script>
<script>
var a = 1;
</script>
// 控制台报错 ReferenceError: a is not defined
这样控制台就报错了
变量提升不能跨script
3.其它情况
首先看不用var直接赋值
console.log(a); //ReferenceError: a is not defined
a = 1;
同样报错,因为使用 var才会变量提升(我所知)
在 if 中
console.log(a) // undifined
if(false){
var a = 1;
}
尽管 if 不通过,还是提升了
4.函数提升
变量声明会提示,函数声明也会
console.log(foo);
var foo=10;
console.log(foo);
function foo(){
}
console.log(foo);
//输出 function a,10,10
函数会优先于变量 先提升
上面代码相当于
function a(){
}
var a;
console.log(a);
a=10;
console.log(a);
console.log(a);
但是,如果用函数表达式,那就只提升了这个 a变量,符合之前的变量提升的逻辑
a();
var a = function () {
console.log(1)
}
//TypeError: a is not a function
5.类
我们es6的class可以声明一个类
let a = new A() // 报错
class A {
}
类声明是不会提升的