JS中变量提升遇到的小问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36521655/article/details/82469651

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

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。

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

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/82469651