为什么图中圈红部分username是:undefined,而不是:小星星

为什么图中圈红部分username是:undefined,而不是:小星星

问题描述:

为什么图中圈红部分username是:undefined,而不是:小星星

相关截图:

图片描述
图片描述

相关代码:

<script>
        var username = "小星星"
        function func() {
                console.log("username为啥是:" + username+"不是小星星");
                var username = "小鱼";

                function funcname() {
                    username = "小慕";
                }

                funcname(username);
                console.log(username);
            }
        func();
        console.log(username);
    </script>

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,是因为函数调用的时候,函数内部也会进行预解析。函数内部username进行了声明,会提升到函数顶部,并赋值为undefined。从上到下执行代码的时候,输出username就是undefined。

简单理解:函数内部有username定义,就是局部变量,不会用全局变量的值。

祝学习愉快!

  • 胡子白了 提问者 #1

    https://img1.sycdn.imooc.com//climg/6198d42409eeb1d104830332.jpg

    https://img1.sycdn.imooc.com//climg/6198d4730922ad0d03000152.jpg

    在funcname函数内部的打印username有值。我的理解是在最外层才有函数和变量声明提升,而在func函数内部的变量和函数没有相关特性,因为func内部的变量和函数是在其调用时才开始执行的。这样理解对吗?

    2021-11-20 19:02:20
  • 好帮手慕然然 回复 提问者 胡子白了 #2

    同学你好,“在最外层才有函数和变量声明提升”这句话理解的不太对,函数内部也会有函数和变量声明提升,比如在func函数内部,变量username和函数funcname都会被预解析到当前作用域(即func函数)的顶部,如图

    https://img1.sycdn.imooc.com//climg/6199bedc092de37b07110402.jpg

    而圈红部分username之所以是undefined,是因为func内部也定义了username(即var username = "小鱼"),一般情况下会先在当前作用中查找username,当前作用域如果没有的话,才会沿着作用域链向上查找上一级作用域中的username,此时func中的username,在执行console.log("username为啥是:" + username + "不是小星星")之前还未被赋值,默认为undefined,如图

    https://img1.sycdn.imooc.com//climg/6199c1f6091beb6807730458.jpg

    祝学习愉快!

    2021-11-21 11:51:25
胡子白了 提问者 2021-11-20 16:17:43

是因为函数定义提升吗?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师