先预解析 后执行
变量预解析(变量提升),函数预解析(函数提升)
变量提升只是把变量声明提升到作用域的最前面,不提升操作。如
变量提升后是:
var a ;
console.log(num);
console.log(num);
a = 10; //这里a=10是位置其实是不动。
函数提升
把所有的函数声明提升到前面,但是不调用。
函数提升后
注意:如果是赋值的方式写的函数,不可以提升。只能提升变量声明的函数。
JavaScript是解释型的语言,但是他并不是真的在运行的时候逐句的往下解析执行。
JavaScript并非仅在运行时简简单单的逐句解析执行!
当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。
先声明
<script>
//一下代码
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = b = 9;//注意这里,不是同时声明abc,如果是同时声明abc应该用逗号隔开 var a=9,b=9,c=9,这样才对。这里只是声明了a而已。
console.log(a);
console.log(b);
console.log(c);
}
//预解析过程,相当于下面的代码
function f1() {
var a ;//这里的a是函数的局部变量,作用域在函数。
a = b = b = 9;//因为前面没有声明b c 所以他们是全局变量。
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
//结果应该是 9 9 9 9 9 报错
</script>