JavaScript预解析
预解析
-
js引擎运行分两步:先预解析,在执行代码
- 预解析:js引擎会把js里面所有的var、function提升到当前作用域的最前面
- 代码执行:按照代码的顺序从上往下执行
-
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
- 变量提升:就是把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
- 函数提升:就是把所有的函数声明提升到当前作用域的最前面,不调用函数
//1Q
console.log(num);
//2Q
console.log(num);
var num = 10;//undefined
//变量提升
//var num;
// console.log(num);
// num=10;
//3Q
fn();//把fn()放上面仍然可以执行
function fn() {
console.log(11);
}
//4Q
fun();
var fun = function () {
console.log(22);
}//报错
//函数表达式调用必须写在函数表达式下面
//相当于执行以下代码
// var fun;
// fun();
// fun = function () {
// console.log(22);
// }
预解析案例
var num = 10;
fun();
function fun() {
console.log(num);
var num = 10;
}
//相当于执行以下代码
var num;
function fun() {
var num;
console.log(num);
num = 10;
}
num = 10;
fun();
var num = 10;
function fn() {
console.log(num);
var num = 20;
console.log(num);
}
fn();
//相当于以下代码
var num;
function fn() {
var num;
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fn();
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);
}
//相当于以下代码
function f1() {
var a;
a = b = c = 9;
//相当于 var a=9;b=9;c=9;b和c直接赋值,没有var声明,当全局变量看
//集体声明var 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);//报错