JS中的变量声明提升与函数声明提升优先级

今天在群里看到了一道题,如下。问输出什么?

var c = 1;
function c(c) {
    console.log(c);
    var c = 2;
}
c(3);

看到的第一眼,第一想法就是这题考察的是变量提升,唔,应该是输出undefined。结果不对,报错了

为啥呢?原来在一个作用域中,变量声明是有顺序的:函数形参声明--->函数声明---->变量声明 。任何一种声明,如果在前面出现,都不会再次声明。所以当变量提升时,也就只有一个有效了。

所以在函数执行环境对应的变量对象中,首先是c:function,然后到第一行定义c=1,所以在变量对象中有变成了c:1,在然后到c(3)语句,此时c定义为了数字,所以报错c is not a function。

同理改变一下上面的代码,在看看它的输出。

var c = 1;
function d(c) {
    console.log(c);
    var c = 2;
}
d(3);

输出是3,为什么呢?因为在执行d(3)时,函数d的执行环境推入环境栈中,与之关联的变量对象也生成,根据之前的规则,先声明函数参数,所以c:3,后面的var变量声明就无效了。

那什么时候才会出现我刚开始答的输出undefined呢?想下面这样时,他输出就是undefined的。

var c = 1;
function d() {
    console.log(c);
    var c = 2;
}
d();

因为不存在函数参数声明,也不存在函数声明,所以执行变量声明,于是a先被提升到函数作用域顶端,其变量对象中的值为{a:undefined},所以输出undefined。

 

不懂的地方还有很多,每次有收获就值得记录一下,不过说的也不一定对,希望能指正出来。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值