解析器执行JavaScript代码的过程
首先预解析
将变量var和函数function的声明提前到作用域的最上面,需要注意的是变量的赋值操作不会提前,这也叫做变量提升
然后执行代码
从上往下,一行一行执行代码
当执行函数时会进入函数内部
再次预解析
然后从上往下,一行一行执行代码
例如,原本的代码是这样:
<script type="text/javascript">
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
</script>
预解析之后是这样:
<script type="text/javascript">
var num;
function fun() {
var num;
console.log(num);
num = 20;
}
num = 10;
fun();
</script>
再比如原本的函数是这样:
<script type="text/javascript">
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);
}
</script>
预解析之后是这样:
function f1(){
var a; //a是局部变量
a = b = c = 9; //b、c是全局变量
//var a = b = c = 9; //等同于var a=9; b=9; c=9;
//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);