JavaScript代码是由浏览器中的JavaScript解析器来执行的,JavaScript解析器在运行
1.JavaScript代码的时候分为两步:预解析和代码执行
1.预解析js引擎会把js里面所有的var和function提升到当前域的最前面
2.代码执行 按照代码书写的顺序从上到下执行
2.预解析分为变量预解析(变量提升)和函数预解析(函数提升)
1.变量提升 就是把所有的变量声明提升到当前作用域的最前面,但是不提升变量赋值
console.log(num); // undefined 坑 1
var num = 10;
// 相当于执行了以下代码
// var num;
// console.log(num);
// num = 10;
2.函数提升 就是把所有的函数声明提升到当前作用域的最前面,但是不调用函数
fun(); // 报错 坑2
var fun = function() {
console.log(22);
}
// 函数表达式 调用必须写在函数表达式的下面
// 相当于执行了以下代码
// var fun;
// fun();//只声明了变量fun没有赋值函数,不能调用
// fun = function() {
// console.log(22);
// }
// 3问 不报错
fn();
function fn() {
console.log(11);
}
相当于
function fn() {
console.log(11);
}
fn();
预解析案例
// 案例1
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();
// 案例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);
}
// 以下代码
// 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;相当于 var a = 9; var b = 9; var c = 9;
// console.log(a);
// console.log(b);
// console.log(c);
// }
// f1();
// console.log(c);
// console.log(b);
// console.log(a);