鍍金池/ 問答/HTML/ 關(guān)于js作用域的一個程序問題

關(guān)于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函數(shù)我已經(jīng)在全局定義了,在writeDate()里應(yīng)該能訪問到。不知道哪里理解有錯誤,代碼需要怎么更改,搞得我現(xiàn)在有點亂,請指出,不勝感激。

回答
編輯回答
陌南塵

你沒有全局定義函數(shù)啊,你在dateInit()是定義了getYear(),通俗點講getYear()是屬于dateInit()的局部函數(shù),dateInit()形成了一個閉包,在函數(shù)外面是不能訪問dateInit()里面的getYear(),只有在dateInit()里面才有權(quán)限訪問getYear()。相對的,你的其他getMonth()之類的函數(shù)也是一樣的,都是未定義。

2017年12月9日 21:17
編輯回答
晚風(fēng)眠

并沒有全局,JS默認(rèn)變量都是函數(shù)級別的作用域。
而你的函數(shù)定義在了dateInit函數(shù)內(nèi)部,只有在這個函數(shù)內(nèi)部才能訪問。

2017年1月30日 23:39
編輯回答
別瞎鬧

找本 JS 的基礎(chǔ)書,比如《JS 高級程序設(shè)計》,好好看閉包的那章。

2018年1月5日 05:50
編輯回答
悶騷型

請好好看一下自己寫的代碼----哪里是全局了

2017年5月15日 14:00