关于js作用域的一个程序问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <div class="date">
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </div>
    <script>
        function check(data) {
            if (data < 10) {
                return `0${data}`
            } else {
                return data;
            }
        }
        function dateInit() {
            var dateNow = new Date();

            function getYear() {
                var yearNow = dateNow.getFullYear();
                yearNow = check(yearNow);
                return yearNow;
            }

            function getMonth() {
                var monthNow = dateNow.getMonth();
                monthNow = check(monthNow);
                return monthNow;
            }

            function getDate() {
                var dayNow = dateNow.getDate();
                dayNow = check(dayNow);
                return dayNow;
            }

            function getHour() {
                var hourNow = dateNow.getHours();
                hourNow = check(hourNow);
                return hourNow;
            }

            function getMinus() {
                var minusNow = dateNow.getMinutes();
                minusNow = check(minusNow);
                return minusNow;
            }

            function getSeconds() {
                var SecondsNow = dateNow.getSeconds();
                SecondsNow = check(SecondsNow);
                return SecondsNow;
            }

            function getDay() {
                var dayArr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
                var dayNow = dateNow.getDay();
                return dayArr[dayNow];
            }
        }
        function writeDate() {
            dateInit();
            var spans = document.querySelectorAll('span');
            spans[0].innerHTML = getYear() + '年 ';
            spans[1].innerHTML = getMonth() + '月 ';
            spans[2].innerHTML = getDate() + '日 ';
            spans[3].innerHTML = getDay();
            spans[4].innerHTML = getHour() + '时';
            spans[5].innerHTML = getMinus() + '分';
            spans[6].innerHTML = getSeconds() + '秒';
            var timer = setInterval(function () {
                writeDate();
            }, 1000)
        }
        writeDate()
    </script>
    </body>

</html>

这是我写的一个自动更新的时钟,可以浏览器报错getYear is not defined我的理解是getYear函数我已经在全局定义了,在writeDate()里应该能访问到。不知道哪里理解有错误,代码需要怎么更改,搞得我现在有点乱,请指出,不胜感激。

阅读 1.9k
4 个回答

你没有全局定义函数啊,你在dateInit()是定义了getYear(),通俗点讲getYear()是属于dateInit()的局部函数,dateInit()形成了一个闭包,在函数外面是不能访问dateInit()里面的getYear(),只有在dateInit()里面才有权限访问getYear()。相对的,你的其他getMonth()之类的函数也是一样的,都是未定义。

找本 JS 的基础书,比如《JS 高级程序设计》,好好看闭包的那章。

请好好看一下自己写的代码----哪里是全局了

并没有全局,JS默认变量都是函数级别的作用域。
而你的函数定义在了dateInit函数内部,只有在这个函数内部才能访问。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题