变量提升
变量提升的原因
JS引擎读取代码时,分为两步,第一步是对整个JS代码进行解析读取,第二步是进行代码的执行。
在代码执行之前,浏览器的解析器遇到变量名和函数声明,将它们提升到当前作用域的最前面。
//变量提升
console.log(a);
var a = "hi";
console.log(a);
//==>
var a;
console.log(a);
a = "hi";
console.log(a);
//函数提升
console.log(a); //f a()
console.log(b); //undefined
function a() {
console.log('hi');
}
var b = function() {
console.log('ok');
}
//==>
function a() {
console.log('hi');
}
var b;
console.log(a);
console.log(b);
b = function(){
console.log('ok');
}
//函数提升会优先于变量提升,且不会被同名的变量覆盖,如果这个同名变量已经赋值了,那函数变量会被覆盖
console.log(a); //f a() {...}
console.log(a()); //2
var a = 1;
function a() {
console.log(2);
}
console.log(a); //1
a = 3;
console.log(a()); //报错,现在的函数a已经被赋值过后的变量a给覆盖了,无法再调用a()