这个怎么处理,在网页环境下运行出错

这个怎么处理,在网页环境下运行出错

VM2027:1 Uncaught SyntaxError: Identifier 'age' has already been declared

    at <anonymous>:1:1

    at n.runCode (code.js?v=202012151901:1)

    at Object.success (code.js?v=202012151901:1)

    at j (jquery.min.js:2)

    at Object.fireWith [as resolveWith] (jquery.min.js:2)

    at x (jquery.min.js:5)

    at XMLHttpRequest.b (jquery.min.js:5)



源码

<!DOCTYPE html>


<html>


<head>


    <meta charset="UTF-8">


    <title>Document</title>


</head>


<body>


    <div id="cYear"></div>


    <script>

        year = null;

         myAge = 2;

        year = prompt("请输入出生年份:");

        class age {

            

            constructor() {

                console.log('初始化年龄');

                this._age = 18;

            }


            get getAge() {

                // 获取当前年份

                console.log('获取年份');

                return this._age;

            }


            set setAge(year = 2000) {

                console.log('设置年份');

                

                let curYear = new Date().getFullYear();

                // console.log(typeof parseInt(year),typeof curYear);


                if (year.length < 4 || parseInt(year) > curYear) {

                    return this._age;

                } else {

                    console.log(this._age = curYear - year);

                    return this._age;

                }

            }

        }


        let myAge = new age();

        myAge.setAge = year;


        cYear.innerHTML = `你的年龄为${myAge.getAge}岁`;

        myAge = 2;

    </script>


</body>


</html>


正在回答 回答被采纳积分+1

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

5回答
好帮手慕久久 2020-12-17 15:40:00

同学你好,由于老师对java了解不是很多,所以这个问题“jsp写的话应该是没问题的?”没法给同学特别肯定的答案。垃圾回收机制在js和java中不一样,重要程度也不一样。在js中,如果想要手动回收变量,那么将其值设置成null就可以了,了解即可。

祝学习愉快!

好帮手慕久久 2020-12-17 14:01:04

同学你好,学到这个阶段,建议不要用在线编辑器测试代码,可能会发生同学所说的这种问题。老师在在线编辑器上测试,有的时候无法正常运行,有的时候就可以(不是刷新后):http://img1.sycdn.imooc.com//climg/5fdaf3a50ab75ec919020910.jpg

这与在线编辑器有关,建议同学使用本地编辑器测试,比如vscode。实际开发中,也会用本地编辑器写代码,而不会用这种在线的,因为它们的功能受限,也有bug。

在本地编辑器上测试,代码是对的,同学以本地测试为准即可。

祝学习愉快!

  • 提问者 慕尼黑7895541 #1
    我知道,主要是在线的即使对象已经没有被指向了,还是无法销毁。。。但用jsp写的话应该没问题吗?毕竟js和java回收机制有区别
    2020-12-17 15:10:26
  • 提问者 慕尼黑7895541 #2
    我知道,主要是在线的即使对象已经没有被指向了,还是无法销毁。。。但用jsp写的话应该没问题吗?毕竟js和java回收机制有区别
    2020-12-17 15:10:32
好帮手慕久久 2020-12-17 09:47:57

同学你好,new age() 就是实例化出来的实例myAge,那么就把myAge清除即可:

http://img1.sycdn.imooc.com//climg/5fdab6e009c7918807140184.jpg

这样处理后,myAge会在程序退出进程时(关闭页面),被垃圾回收机制清除掉。另外,这样修改,代码并不会报错,建议同学新建一个问题,把自己报错的代码粘贴出来,老师再帮同学解答。

由于js不需要手动回收垃圾,所以关于垃圾回收机制的内容,了解即可。

祝学习愉快!

  • 提问者 慕尼黑7895541 #1
    醉了醉了。。。你粘贴到慕课网网页上运行第二次看看,不是编辑器
    2020-12-17 11:58:57
  • 提问者 慕尼黑7895541 #2
    只有刷新才有用
    2020-12-17 11:59:24
提问者 慕尼黑7895541 2020-12-16 19:17:57

我粘贴错了 我想问的是,如果把new age() 清除,给变量赋值null也不行, GC回收还是没删除对象,网页还是报错

好帮手慕久久 2020-12-16 19:09:52

同学你好,老师测试你的代码,报错信息与同学的不一样,如下:

http://img1.sycdn.imooc.com//climg/5fd9ea1209dd820b07190128.jpg

原因是myAge先使用,后声明了,如下:

http://img1.sycdn.imooc.com//climg/5fd9ea63091e983107730272.jpg

可做如下调整:

http://img1.sycdn.imooc.com//climg/5fd9ea8209b0756d07430274.jpg

另外,建议使用let关键字声明变量,这样更规范,如下:

http://img1.sycdn.imooc.com//climg/5fd9eab209bb0c6606660280.jpg

同学按照上面调整一下,看下能否正常运行,如果不行的话,再把改后的代码粘贴出来,老师再帮你排错。

祝学习愉快!

  • 提问者 慕尼黑7895541 #1
    我粘贴错了 我想问的是,如何把new age() 清除,给变量赋值null也不行, GC回收机制还是没删除对象,网页还是报错,而year确可以
    2020-12-16 19:19:25
  • 提问者 慕尼黑7895541 #2

    <!DOCTYPE html>


    <html>


    <head>


        <meta charset="UTF-8">


        <title>Document</title>


    </head>


    <body>


        <div id="cYear"></div>


        <script>

            year = null;

            year = prompt("请输入出生年份:");

            class age {

                

                constructor() {

                    console.log('初始化年龄');

                    this._age = 18;

                }


                get getAge() {

                    // 获取当前年份

                    console.log('获取年份');

                    return this._age;

                }


                set setAge(year = 2000) {

                    console.log('设置年份');

                    

                    let curYear = new Date().getFullYear();

                    // console.log(typeof parseInt(year),typeof curYear);


                    if (year.length < 4 || parseInt(year> curYear) {

                        return this._age;

                    } else {

                        console.log(this._age = curYear - year);

                        return this._age;

                    }

                }

            }


            let myAge = new age();

            myAge.setAge = year;


            cYear.innerHTML = `你的年龄为${myAge.getAge}岁`;

            myAge = 2;

        </script>


    </body>


    </html>


    2020-12-16 21:15:40
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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