一.预解析
JS代码执行由浏览器中的JS解析器来执行。JS解析器执行JS代码的两个过程是预解析和代码执行。
- 第一步:变量提升,把变量的声明提升到当前作用域的最上面,不会提升变量赋值
- 第二步:函数提升,把函数的声明提升到当前作用域的最上面,不会提升函数调用
- 先提升var,再提升function
1/*例一:变量提升*/2console.log(num);3var num = 5;4//预解析5var num;6console.log(num);7num = 5;8/*例二:函数提升*/9f1();10function f1() {11console.log('hello');12}13//预解析14function f1() {15console.log('hello');16}17f1();二.案例
1/*例一*/2var a = 25;3function abc() {4console.log(a);5var a = 10;6}7abc();8//预解析9var a;10function abc() {11//局部作用域的预解析12var a;13console.log(a);14a = 10;15}16a = 25;17abc();//结果打印出undefined,因为局部作用域里变量声明提升后的下一句就是打印了,还没有赋值18/*例二*/19console.log(a);20function a() {21console.log('aaa');22}23var a = 1;24console.log(a);25//预解析26//在预解析的过程中如果函数和变量的名字相同,那么结果输出是函数优先27var a;28function a() {29console.log('aaa');30}31console.log(a);//打印函数a32a = 1;33console.log(a);//134/*例三*/35var a = 10;36f1();37function f1() {38var b = 5;39console.log(a);40console.log(b);41var a = '123';42}43//预解析44var a;45function f1() {46var b;47var a;48b = 5;49console.log(a);50console.log(b);51a = '123';52}53a = 10;54f1();//undefined 555/*例四*/56f1();57console.log(c);58console.log(b);59console.log(a);60function f1() {61var a = b = c = 10;62console.log(a);63console.log(b);64console.log(c);65}66//预解析67function f1() {68var a;69a = b = c = 10;//b和c是全局变量,因为没有直接var70console.log(a);71console.log(b);72console.log(c);73}74f1();//10 10 1075console.log(c);//1076console.log(b);//1077console.log(a);//a is not defined,因为a是局部变量