JavaScript—变量提升

我们先来看一个例子:

var num = 10;

fun();

function fun(){
    console.log(num);   //输出undefined

    var num = 20;

    console.log(num);   //输出20
}

这里就有一个疑问了:为什么是undefined而不是10呢?

其实在真实的解析过程是这样的:

function fun(){
    var num               //先声明变量

    console.log(num);

    num= 20;             //到这里再赋值

    console.log(num);
}

var num = 10;

fun();

这就是JavaScript的变量提升:JavaScript的函数内定义的局部变量,不管在哪一行声明赋值,解析的时候都会将函数声明强行提升到函数的开头部分,但变量的赋值还是在我们写代码时变量所在行数进行赋值。
赋值并没有被提升,只是声明被提升了。

在说说例子:因为有了局部变量num的声明,所以全局变量num会被忽略,而局部变量的声明被提升到了函数的开头,没有赋值,所以console.log(num)输出undefined


如果函数和变量同名的时候是怎么提升的呢?来看一下

console.log(showNum);   //输出showNum函数

var showNum = 10;

function showNum(){}

这个解析过程是这样的:

function showNum(){}

var showNum      //被忽略掉了

console.log(showNum);

showNum = 10;

这是因为在拥有同一个标识符的情况下,变量声明和函数都会被提升;函数声明会覆盖变量声明,但是不会覆盖变量赋值。
来直接上代码,更直观点,稍微改一下例子的代码(顺序调换)。

var showNum = 10;

console.log(showNum);  //显示变量10

function showNum(){}

看到这里我就不写解析过程了,变量声明的同时初始化或赋值那么变量优先级高于函数,就不会再被忽略掉了。

当然,这里只是帮助理解的例子,在实际开发中绝对绝对绝对不可以让变量和函数同名哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值