1
ccyu220 2020-04-09 19:00:22 +08:00
let 不允许重复声明,都用了 es6 你重复声明 let gogogo 干嘛。
|
2
ccyu220 2020-04-09 19:00:43 +08:00
|
3
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 () {省略...}) } |
4
useben 2020-04-09 19:08:32 +08:00 5
我是被头像吸引进来
|
8
Jirajine 2020-04-09 19:39:45 +08:00 via Android
|
9
ljpCN 2020-04-09 19:45:01 +08:00 via Android
@Cielos 在你贴的代码里,如果用 var,里面的函数里的和外面的函数里的 gogogo 就不是同一个变量了。
|
10
suckli 2020-04-09 20:07:41 +08:00
我是被头像吸引进来
|
11
lzxz1234 2020-04-10 08:32:21 +08:00
提问的艺术第一条:换个好头像
|
12
fueen 2020-04-10 09:16:39 +08:00
头像+1
|
13
iMiata 2020-04-10 09:28:05 +08:00
头像选得好,绅士少不了
|
14
wgbx 2020-04-10 09:57:58 +08:00
论头像的重要性,var 可以重复声明,let 不允许,ps:var 作为一种过时的声明方式,建议只使用 let 和 const
|
15
ElmerZhang 2020-04-10 10:19:57 +08:00
建议楼主读一下 《 ES6 标准入门》
|
16
ElmerZhang 2020-04-10 10:21:16 +08:00
除非完全没有编程基础,否则学习一门新语言时最好买本书从基本语法入手。
|
17
werty 2020-04-10 11:13:24 +08:00
头像+1
|
18
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 我怎么感觉这是同一种错误.... |
19
djs 2020-04-10 15:27:16 +08:00 via iPhone
let 可以导致暂时性死区,在你用的 let 那个位置,要先生命变量才行
|
20
vivipure 2020-04-10 15:37:59 +08:00
建议 直接看 ruanyifeng 的 ES6 或者 MDN 文档
|
21
kingthy 2020-04-10 16:42:46 +08:00
@Curtion 是同一个错误,ReferenceError,只是描述不一样,你把它看为第一种是编译期错误,第二种是运行期错误。比如第二种 function main() {
console.log(a) let a = "1" } |
22
kingthy 2020-04-10 16:43:17 +08:00
怎么自动发布了,补上面:
|
23
kingthy 2020-04-10 16:44:07 +08:00
怎么自动发布了,补上面:方法定义后不执行是可以“编译”通过的
|
24
ourFEer 2020-04-10 17:39:59 +08:00
我是被头像吸引进来的
|
25
Cielos OP 非常感谢大家的回答!
|
26
theohateonion 2020-04-10 20:54:29 +08:00
@ccyu220 并不是 let 不允许重复声明,而是 18 楼说的死区问题
|