JS引擎运行js分为两步:预解析和代码执行
(1)预解析:js引擎会把js里面所有的var和function等提升到当前作用域的最前面
(2)代码执行:按照代码书写的顺序从上往下执行
预解析分为:变量预解析 和函数预解析
(1)变量提升:把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
(2)函数提升:把所有的函数声明提升到当前作用域的最前面,不调用函数
<script>
// console.log(num1); // Uncaught ReferenceError: num1 is not defined
console.log(num2); //undefined
var num2 = 10;
//以上代码相当于执行了以下代码
// var num2;
// console.log(num2);
// var num2 = 10;
fun1(); //在函数声明前调用 正常输出 111
function fun1() {
console.log(111);
}
fun1(); //在函数声明后调用 正常输出 111
//以上代码相当于执行了以下代码
// function fun1() {
// console.log(111);
// }
// fun1();
//fun2(); //Uncaught TypeError: fun2 is not a function
var fun2 = function() {
console.log(222);
}
fun2(); //正常输出222
//若在函数声明前调用,相当于执行以下代码
// var fun2;
// fun2();
// var fun2 = function() {
// console.log(222);
// }
</script>