javascript,变量的提升

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

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

4个回答

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

 var num =undefined;
fun();
num = 10;
function fun(){
var num =undefined;
    console.log(num);
    num = 20;
}
showbo
支付宝加好友偷能量挖,胡杨等着我的招呼 回复Qinwei-007: 记得采纳:)。。
3 年多之前 回复
weixin_36813246
YDYDYDQ 嗯嗯,大概体会到了。非常感谢
3 年多之前 回复

我对这个的理解是。

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

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

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

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

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

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





github_39019689
github_MangoTsing 回复m_z_n: 谢谢,我对函数作用域看的不到位。存在变量提升,但是到了输出的地方还没有赋值。
3 年多之前 回复
m_z_n
m_z_n 回复github_MangoTsing:js在es6之前没有块级作用域,这里是函数作用域没错,但是有预解析的过程,存在变量及函数提升
3 年多之前 回复
github_39019689
github_MangoTsing 这个是函数作用域,类似块级作用域,不存在变量提升
3 年多之前 回复

代码的执行分为两个阶段:预解析和逐步执行
预解析:变量声明提升和函数提升
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 其赋值并不会提升,个人理解

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐