javascript,变量的提升

fun();
var num = 10;
function fun(){

    console.log(num);
    var num = 20;
}
    结果为什么是undefined?那个大神能说说过程?

var在其作用域内会首先申明赋值undefined,执行到对应的语句才会执行赋值,你这个问题还有个变量作用域的问题,fun中使用的是内部的num,而不是window下的num
等价于下面的

 var num =undefined;
fun();
num = 10;
function fun(){
var num =undefined;
    console.log(num);
    num = 20;
}

我对这个的理解是。

浏览器先解析函数代码块。

因此你的代码如下,先解析了代码块,调用了ab();

在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。

现在浏览器大部分支持es6语法,少量不支持。那么在块级作用域下面是不存在变量提升的。

当你的代码执行到ab();时,console.log(num)中的num变量是未定义的。

    var num=10;
    function ab(){
         console.log(num);
        var num=12;
    };





代码的执行分为两个阶段:预解析和逐步执行
预解析:变量声明提升和函数提升
var num;
function fun(){
//函数内预解析
var num;
console.log(num); //这个时候会查找当前作用域的num,只申明没赋值,返回undefined
num = 20;
}
fun();
num=10;

var num;
fun();
num = 10;
function fun(){
    console.log(num);
    num = 20;
}

应该比较容易理解,变量提升是指变量的提升就是var 其赋值并不会提升,个人理解