let 会报错, var 才能正常运行?
- 0次
- 2021-08-17 23:38:17
- idczone
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 的详细用法呢?
let 不允许重复声明,都用了 es6 你重复声明 let gogogo 干嘛。
教程: https://es6.ruanyifeng.com/#README
这样改应该就可以了,let 定义的变量名不允许重定义,但是允许重复赋值。
window.onload = function () {
let gogogo;
let btn1 = document.getElementById('btn1');
btn1.onclick = function () {
clearInterval(gogogo);
gogogo = setInterval(function () {省略...})
}
我是被头像吸引进来
+1
仅仅是去掉一个 let 就可以了吗!谢谢大佬!!!
谢谢大佬了!所以 var 是可以重复定义的是吗
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
在你贴的代码里,如果用 var,里面的函数里的和外面的函数里的 gogogo 就不是同一个变量了。
我是被头像吸引进来
提问的艺术第一条:换个好头像
头像+1
头像选得好,绅士少不了
论头像的重要性,var 可以重复声明,let 不允许,ps:var 作为一种过时的声明方式,建议只使用 let 和 const
建议楼主读一下 《 ES6 标准入门》
除非完全没有编程基础,否则学习一门新语言时最好买本书从基本语法入手。
头像+1
这是因为 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
我怎么感觉这是同一种错误....
let 可以导致暂时性死区,在你用的 let 那个位置,要先生命变量才行
建议 直接看 ruanyifeng 的 ES6 或者 MDN 文档
是同一个错误,ReferenceError,只是描述不一样,你把它看为第一种是编译期错误,第二种是运行期错误。比如第二种 function main() {
console.log(a)
let a = "1"
}
怎么自动发布了,补上面:
怎么自动发布了,补上面:方法定义后不执行是可以“编译”通过的
我是被头像吸引进来的
非常感谢大家的回答!
并不是 let 不允许重复声明,而是 18 楼说的死区问题