V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Cielos

let 会报错, var 才能正常运行?

  •  
  •   Cielos · Apr 9, 2020 · 4342 views
  •   You need to sign in to view this topic
    This topic created in 2214 days ago, the information mentioned may be changed or developed.
    window.onload = function () {
    var gogogo;
    let btn1 = document.getElementById('btn1');

    btn1.onclick = function () {
    clearInterval(gogogo);
    var gogogo = setInterval(function () {省略...})
    }

    各位好,我刚学 JS 没多久,跟着李立超的视频学的。
    上面这段代码里,如果我把 var gogogo 改成 let,压根就没法运行,请问是什么原因啊?
    还有 clearInterval()应该可以中止定时函数,但是并没有中止,重复点击依然有效,这又是什么情况?

    PS: 李立超的教程是 2016 年录的,当时还没有 LET 吧,像我这样的初学者应该去哪里了解 LET 的详细用法呢?
    26 replies    2020-04-10 20:54:29 +08:00
    ccyu220
        1
    ccyu220  
       Apr 9, 2020
    let 不允许重复声明,都用了 es6 你重复声明 let gogogo 干嘛。
    ccyu220
        2
    ccyu220  
       Apr 9, 2020
    baxtergu
        3
    baxtergu  
       Apr 9, 2020
    这样改应该就可以了,let 定义的变量名不允许重定义,但是允许重复赋值。

    window.onload = function () {
    let gogogo;
    let btn1 = document.getElementById('btn1');

    btn1.onclick = function () {
    clearInterval(gogogo);
    gogogo = setInterval(function () {省略...})
    }
    useben
        4
    useben  
       Apr 9, 2020   ❤️ 5
    我是被头像吸引进来
    wangyzj
        5
    wangyzj  
       Apr 9, 2020
    @useben +1
    Cielos
        6
    Cielos  
    OP
       Apr 9, 2020
    @baxtergu 仅仅是去掉一个 let 就可以了吗!谢谢大佬!!!
    Cielos
        7
    Cielos  
    OP
       Apr 9, 2020
    @ccyu220 谢谢大佬了!所以 var 是可以重复定义的是吗
    ljpCN
        9
    ljpCN  
       Apr 9, 2020 via Android
    @Cielos 在你贴的代码里,如果用 var,里面的函数里的和外面的函数里的 gogogo 就不是同一个变量了。
    suckli
        10
    suckli  
       Apr 9, 2020
    我是被头像吸引进来
    lzxz1234
        11
    lzxz1234  
       Apr 10, 2020
    提问的艺术第一条:换个好头像
    fueen
        12
    fueen  
       Apr 10, 2020
    头像+1
    iMiata
        13
    iMiata  
       Apr 10, 2020
    头像选得好,绅士少不了
    wgbx
        14
    wgbx  
       Apr 10, 2020
    论头像的重要性,var 可以重复声明,let 不允许,ps:var 作为一种过时的声明方式,建议只使用 let 和 const
    ElmerZhang
        15
    ElmerZhang  
       Apr 10, 2020
    建议楼主读一下 《 ES6 标准入门》
    ElmerZhang
        16
    ElmerZhang  
       Apr 10, 2020
    除非完全没有编程基础,否则学习一门新语言时最好买本书从基本语法入手。
    werty
        17
    werty  
       Apr 10, 2020
    头像+1
    Curtion
        18
    Curtion  
       Apr 10, 2020
    这是因为 let 暂时性死区问题,onclick 中调用 clearInterval 函数时会用到 gogogo 变量,此时因为使用了 let 所有存在 TDZ 问题,导致并不会向上级作用域寻找 gogogo 变量,所有会报 Cannot access '' before initialization 错误。

    clearInterva 没有中止有两个原因,一是因为 onclick 中使用了 var 定义变量,每次点击时的 gogogo 都是新的,结果就是不但没有停止,每次点击时还新建了一个定时器;如果把 var 去后也无法停止,原因是虽然停止了定时器,但是又新建了一个定时器。


    我感觉很奇怪的就是:
    console.log(a)
    let a = "1"
    报的错误是:Uncaught ReferenceError: a is not defined


    而:
    function main() {
    console.log(a)
    let a = "1"
    }
    main()
    报的错误是:Uncaught ReferenceError: Cannot access 'a' before initialization

    我怎么感觉这是同一种错误....
    djs
        19
    djs  
       Apr 10, 2020 via iPhone
    let 可以导致暂时性死区,在你用的 let 那个位置,要先生命变量才行
    vivipure
        20
    vivipure  
       Apr 10, 2020
    建议 直接看 ruanyifeng 的 ES6 或者 MDN 文档
    kingthy
        21
    kingthy  
       Apr 10, 2020
    @Curtion 是同一个错误,ReferenceError,只是描述不一样,你把它看为第一种是编译期错误,第二种是运行期错误。比如第二种 function main() {
    console.log(a)
    let a = "1"
    }
    kingthy
        22
    kingthy  
       Apr 10, 2020
    怎么自动发布了,补上面:
    kingthy
        23
    kingthy  
       Apr 10, 2020
    怎么自动发布了,补上面:方法定义后不执行是可以“编译”通过的
    ourFEer
        24
    ourFEer  
       Apr 10, 2020
    我是被头像吸引进来的
    Cielos
        25
    Cielos  
    OP
       Apr 10, 2020
    非常感谢大家的回答!
    theohateonion
        26
    theohateonion  
       Apr 10, 2020
    @ccyu220 并不是 let 不允许重复声明,而是 18 楼说的死区问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1541 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    ♥ Do have faith in what you're doing.