1. 预解析
JavaScript代码是由浏览器来执行的。JavaScript解析器在运行js代码时分为两步:预解析和执行代码。
代码示例:
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>预解析</title> <script> // 1问 num is not defined // console.log(num); // 2问 预解析提升了变量声明 但是不提升赋值操作 undefined // 所以代码执行顺序为 var num; console.log(num); num = 10; 所以输出为undefined console.log(num); var num = 10; // 3问 可以调用 fn();//已经把函数声明提升到最前面了 function fn() { console.log(11); } //4问 //放在上面报错 所以采用函数表达式声明函数调用必须放在后面 //执行顺序 var fun; fun(); fun赋值操作 fun(); var fun = function() { console.log(22); } //可以调用 fun(); //我们JS引擎运行js分为两步 预解析 和 代码执行 //1 预解析 js引擎会把js里面所有的var 还有 function 提升到当前作用域的最前面 //2 代码执行 按照代码书写的顺序 从上往下执行 // 预解析还分为 变量预解析(变量提升) 和 函数预解析(函数提升) //变量预解析 就是把所有的变量声明提升到当前作用域的最前面 不提升赋值操作。 //函数提升 就是把所有的函数声明提升到当前作用域的最前面 但是不调用 </script> </head>
面试案例
//请问输出什么
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
//预编译后的代码顺序为
var num;
function fun() {
var num;
console.log(num);
num = 20;
}
num = 10;
fun();
//所以输出的是 undefined
面试案例二:
//下面输出什么 //注意 在函数内部 没有声明的直接赋值的变量也是全局变量 function f1() { //相当于 var a = 9; b = 9; c = 9 var a = b = c = 9; console.log(a); console.log(b); console.log(c); } f1(); console.log(c); console.log(b); console.log(a); //预解析后 function f1() { var a; a = 9; b = 9; c = 9; console.log(a);// 9 console.log(b);// 9 console.log(c);// 9 } f1() console.log(c);// 9 console.log(b);// 9 console.log(a);// a is not defined