推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
Cielos

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

  •  
  •   Cielos · Apr 9, 2020 · 4945 views
    This topic created in 2400 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
    ccyu220
    Apr 9, 2020
    1
    let 不允许重复声明,都用了 es6 你重复声明 let gogogo 干嘛。
    baxtergu
    baxtergu
    Apr 9, 2020
    3
    这样改应该就可以了,let 定义的变量名不允许重定义,但是允许重复赋值。

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

    btn1.onclick = function () {
    clearInterval(gogogo);
    gogogo = setInterval(function () {省略...})
    }
    useben
    useben
    Apr 9, 2020❤️5
    4
    我是被头像吸引进来
    wangyzj
    wangyzj
    Apr 9, 2020
    5
    @useben +1
    Cielos
    Cielos
    OP
    Apr 9, 2020
    6
    @baxtergu 仅仅是去掉一个 let 就可以了吗!谢谢大佬!!!
    Cielos
    Cielos
    OP
    Apr 9, 2020
    7
    @ccyu220 谢谢大佬了!所以 var 是可以重复定义的是吗
    ljpCN
    ljpCN
    Apr 9, 2020 via Android
    9
    @Cielos 在你贴的代码里,如果用 var,里面的函数里的和外面的函数里的 gogogo 就不是同一个变量了。
    suckli
    suckli
    Apr 9, 2020
    10
    我是被头像吸引进来
    lzxz1234
    lzxz1234
    Apr 10, 2020
    11
    提问的艺术第一条:换个好头像
    fueen
    fueen
    Apr 10, 2020
    12
    头像+1
    iMiata
    iMiata
    Apr 10, 2020
    13
    头像选得好,绅士少不了
    wgbx
    wgbx
    Apr 10, 2020
    14
    论头像的重要性,var 可以重复声明,let 不允许,ps:var 作为一种过时的声明方式,建议只使用 let 和 const
    ElmerZhang
    ElmerZhang
    Apr 10, 2020
    15
    建议楼主读一下 《 ES6 标准入门》
    ElmerZhang
    ElmerZhang
    Apr 10, 2020
    16
    除非完全没有编程基础,否则学习一门新语言时最好买本书从基本语法入手。
    werty
    werty
    Apr 10, 2020
    17
    头像+1
    Curtion
    Curtion
    Apr 10, 2020
    18
    这是因为 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
    djs
    Apr 10, 2020 via iPhone
    19
    let 可以导致暂时性死区,在你用的 let 那个位置,要先生命变量才行
    vivipure
    vivipure
    Apr 10, 2020
    20
    建议 直接看 ruanyifeng 的 ES6 或者 MDN 文档
    kingthy
    kingthy
    Apr 10, 2020
    21
    @Curtion 是同一个错误,ReferenceError,只是描述不一样,你把它看为第一种是编译期错误,第二种是运行期错误。比如第二种 function main() {
    console.log(a)
    let a = "1"
    }
    kingthy
    kingthy
    Apr 10, 2020
    22
    怎么自动发布了,补上面:
    kingthy
    kingthy
    Apr 10, 2020
    23
    怎么自动发布了,补上面:方法定义后不执行是可以“编译”通过的
    ourFEer
    ourFEer
    Apr 10, 2020
    24
    我是被头像吸引进来的
    Cielos
    Cielos
    OP
    Apr 10, 2020
    25
    非常感谢大家的回答!
    theohateonion
    theohateonion
    Apr 10, 2020
    26
    @ccyu220 并不是 let 不允许重复声明,而是 18 楼说的死区问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2975 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 12:49 · PVG 20:49 · LAX 04:49 · JFK 07:49
    ♥ Do have faith in what you're doing.