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

2020-04-09 18:39:38 +08:00
 Cielos
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 的详细用法呢?
3382 次点击
所在节点    JavaScript
26 条回复
ccyu220
2020-04-09 19:00:22 +08:00
let 不允许重复声明,都用了 es6 你重复声明 let gogogo 干嘛。
ccyu220
2020-04-09 19:00:43 +08:00
baxtergu
2020-04-09 19:07:31 +08:00
这样改应该就可以了,let 定义的变量名不允许重定义,但是允许重复赋值。

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

btn1.onclick = function () {
clearInterval(gogogo);
gogogo = setInterval(function () {省略...})
}
useben
2020-04-09 19:08:32 +08:00
我是被头像吸引进来
wangyzj
2020-04-09 19:28:10 +08:00
@useben +1
Cielos
2020-04-09 19:30:59 +08:00
@baxtergu 仅仅是去掉一个 let 就可以了吗!谢谢大佬!!!
Cielos
2020-04-09 19:32:51 +08:00
@ccyu220 谢谢大佬了!所以 var 是可以重复定义的是吗
Jirajine
2020-04-09 19:39:45 +08:00
ljpCN
2020-04-09 19:45:01 +08:00
@Cielos 在你贴的代码里,如果用 var,里面的函数里的和外面的函数里的 gogogo 就不是同一个变量了。
suckli
2020-04-09 20:07:41 +08:00
我是被头像吸引进来
lzxz1234
2020-04-10 08:32:21 +08:00
提问的艺术第一条:换个好头像
fueen
2020-04-10 09:16:39 +08:00
头像+1
iMiata
2020-04-10 09:28:05 +08:00
头像选得好,绅士少不了
wgbx
2020-04-10 09:57:58 +08:00
论头像的重要性,var 可以重复声明,let 不允许,ps:var 作为一种过时的声明方式,建议只使用 let 和 const
ElmerZhang
2020-04-10 10:19:57 +08:00
建议楼主读一下 《 ES6 标准入门》
ElmerZhang
2020-04-10 10:21:16 +08:00
除非完全没有编程基础,否则学习一门新语言时最好买本书从基本语法入手。
werty
2020-04-10 11:13:24 +08:00
头像+1
Curtion
2020-04-10 14:49:33 +08:00
这是因为 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
2020-04-10 15:27:16 +08:00
let 可以导致暂时性死区,在你用的 let 那个位置,要先生命变量才行
vivipure
2020-04-10 15:37:59 +08:00
建议 直接看 ruanyifeng 的 ES6 或者 MDN 文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX