1.在浏览器读JS代码的时候有一个预解析,此时会有一个变量提升。
2.什么是变量提升
第一种情况
在预解析时, 将 JS 内部的 变量 全部提升到 当前作用域顶端(当前代码的最上边);
变量提升的时候, 值不会到最顶端, 可以理解为, 把声明变量提升到最顶端, 但是没赋值。
a = 2;
var a;
console.log(a);
运行结果:2
假设这段代码从上到下执行,肯定输出undefined,然而JavaScript却不是自上而下执行的语言。这个主要是有变量提升,他回将当前作用域的所有变量的声明,提升到程序的顶部,因此,上面的代码等价于以下代码。
var a;
a = 2;
console.log(a);
运行结果:2
第二种情况
console.log(a);
var a = 2;
运行结果:undefined
JavaScript会将变量的声明提升到顶部,但是赋值语句是不会有变量提升的。对于var a = 2是分为两步解析的:
var a;
a = 2;
而js只会提升var a这句,所以刚刚那么等于:
var a;
console.log(a);
a = 2;
第三种情况
fn();
function fn(){
console.log('fn');
}
var fn = 2;
运行结果:fn
fn();
function fn(){
console.log('fn1');
}
function fn(){
console.log('fn2');
}
运行结果:fn2
fn();
var fn = function(){
console.log('fn');
}
运行结果:报错