javascript代码是由浏览器的javascript解析器来执行的,javascript解析器在运行时也分为两步:预解析和代码执行
预解析
js会把里面所有var还有function提升到当前作用域的最上面,最前面
然后再代码执行
变量提升
就是把所有声明变量提升到当前作用域最前面 但是不提升赋值操作
例:
console.log(num); //打印undefined
var num =10;
解析:
上面的代码由于变量提升相当于进行了这么一步操作
var num;
console.log(num); //因为声明了但是没有赋值所以才会返回undefined
num =10;
第二个例子:
num();
var num = function() {
}
解析:
上面的代码进行了这么一步操作
var num;
num();//因为上面根本没有这样一个函数体,所以报错 反正就记住在用匿名函数的时候,调用一定要写在函数体下面
num = function(){
}
函数提升
就是把函数声明提升到当前作用域的最前面,但是不调用函数
例:
num1();
function num1() {
//省略
}
解析:
因为会把函数声明提升到最前面,所以就算你这么写最后机器分析时还是
function num1() {
//省略
}
num1();
这种格式
这个时候有个重点,只有用关键字声明的才可以,赋值方法(匿名函数),他就不会提升,这是重点,一定不要搞混了
课程练习
var num =20;
function num1() {
console.log(num);
var num =20;
console.log(num);
}
num1();
上面代码等于做了以下操作:
var num;//这一步是变量提升
function num1() { //这一步是函数提升
var num //这一步是变量提升
console.log(num);
num =20;
console.log(num);
}
num =20;
num1();
最后输出undefined和20