首先考虑几个问题,以下代码都会输出什么?
第1问
console.log(num);
第2问
console.log(num);
var num=10;
第3问
function fn(){
console.log(11);
}
fn();
第4问
fun();
var fun=function(){
console.log(22);
}
js引擎运行js分两步:预解析,代码执行。
预解析:js引擎会把js里面所有的var还有function提升到当前作用域 的最前面。
代码执行:按照代码书写的顺序自上而下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
变量预解析(变量提升)是把所有的变量声明提升到当前作用域的前面,不提升赋值操作。
console.log(num);
var num=10相当于
var num;
console.log(num);
num=10;
所以,输出为undefined
fun();
var fun=function(){
console.log(22);
}相当于
var fun;
fun();
fun=function(){
console.log(22);
}变量未被赋值,故输出报错fun不是一个函数。
函数预解析(函数提升)就是把所有的函数声明提升到当前作用域的最前面,不调用函数。
function fn(){
console.log(11);
}
fn();或fn();
function fn(){
console.log(11);
}可以正常执行