JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行javas代码的时候分为两步:预解析和代码执行。
1. js引擎运行js 分为两步:预解析 代码执行
(1) 预解析js引擎会把js里面所有的var 还有function 提升到当前作用域的最前面
(2) 代码执行 按照代码书写的顺序从上往下执行
2. 预解析分为变量预解析(变量提升) 和 函数预解析(函数提升)
(1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
(2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
<script>
// 1.问
console.log(num);
// 2.问
console.log(num); // Undefined 坑1
var num = 10;
// 相当于执行了以下代码
var num;
console.log(num);
num = 10;
// 3.问
fn();
function fn(){
console.log(11);
}
// 4.问
fun(); //报错 坑2
var fun = function(){
console.log(22);
}
// 相当于执行了以下代码
var fun;
fun();
function fun(){
console.log(22);
}
</script>
案例1:
<script>
// 案例1
var num = 10;
fun(); // undefined
function fun(){
console.log(num);
var num = 20;
}
// 相当于执行了以下操作
// var num;
// fun();
// function fun(){
// var num;
// console.log(num);
// num = 20;
// }
// num = 10;
// fn();
</script>
重点案例
<script>
// 重点案例:
function f1(){
var a = b = c = 9;
// 相当于 var a = 9; b = 9; c = 9; b 和 c 直接赋值 没有var
// 集体声明 var a = 9, b = 9, c = 9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(c);
//9 9 9 not defined
</script>