关于函数声明提升和变量声明提升的疑问?

这是我在知乎上看到的一位老哥对于函数声明提升解释的一部分,这位哥是不是写的不太对,正常不是整个函数声明提到全局作用域最顶部吗?正确的提升方式不是应该是以下方式吗?


        function a() {
            console.log(10)
        }
        var a;
        console.log(a);
        console.log(a())
        a = 3;
        console.log(a)
        a = 6;
        console.log(a())

这位哥写成函数表达式的形式是不是不对?

最后第一句console.log(a())是undefined,这个可以可以理解因为没有返回值,那为什么最后一句console.log(a())就会报错呢?是受到前初始化a变量的影响吗?

 

这个问题很简单。因为a变量一直在变化

js是弱类型语法。

所以任何变量都能改变a的值。

js是顺序执行的。

显而易见的,定义函数之后,就是函数。

当a被赋值为3的时候,已经是整型变量了,所以再用a()调用函数肯定会报错。

这就非常清楚了。

当函数没有返回值的时候,你console.log(b())一定是undefined;

而10为什么会打印出来,因为是a函数内部打印的。

因为这是在演示声明提升后的效果写成函数表达式或函数声明语句的形式都是可以的,
 
        function a() { //函数声明语句提升到最前面
            console.log(10)
        }
        var a;  //之后是变量提升,js的变量名和函数名是等同的,a函数已经声明过了,这句不会产生任何作用
        console.log(a);
        console.log(a()) //a函数没有返回值,所以返回是undefined
        a = 3;
        console.log(a)
        a = 6;
        console.log(a()) //由于js的变量名和函数名是等同的,a已经重新赋值为6,a() 就等于 6() ,6不是函数就会出错。
 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

也许对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y