JavaScript解析器在执行代码前会将var和function声明的变量在内存中提前声明或定义,函数和变量都是在当前作用域进行提升的。
要是你有一些基础的情况,以下案例是可以自行说出来的,再复制到编辑器中求证:
// 练习
// alert(a);
// var a = 1;
// alert(a)
// function a() {
// return false;
// }
// 案例1
// var num = 10;
// fun();
// function fun() {
// console.log(num);
// var num = 20;
// }
// console.log(num)
// 案例2
// var num = 10;
// function fn() {
// console.log(num);
// var num = 20;
// console.log(num);
// }
// fn();
// 案例3
// var a = 18;
// f1();
// function f1() {
// var b = 9;
// console.log(a);
// console.log(b);
// var a = '123';
// }
有个很有意思的案例:
// 案例4
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
我的想法:f1()是会执行的,依次输出9,9,9 ;但在函数外输出c,b,a是会报错的;
真正执行结果是:
9
9
9
9
9
Uncaught ReferenceError:a is not defined
还原一下代码,应该这样的的情况:
(function () { var e = 1; })()
console.log(e);//报错,e is not defined
(function() { f = 2;})()
console.log(f);//2
//也就是说 var a=b=c=9 应该是 c=9;b=c;var a=b; b和c是没有var声明的,所以会是全局变量