我想知道为什么我在使用在我执行函数的同一行上声明的变量的函数中得到“x variable not defined”的错误。这是片段(ES6)
let timeout = resetTimeout();
function resetTimeout () { timeout = 0; return timeout }
为什么范围界定在这里?在函数定义之前定义变量,为什么?
修改 为了澄清这个问题,我知道它可以用于var。我已经读过let和const的范围,我无法理解为什么这不能像我期望的那样工作。我正在寻找的是解释,而不是解决方案。
答案 0 :(得分:2)
您正在使用let创建变量并立即为其分配函数的返回值。这没关系。
问题出在功能内部。如果不指定变量timeout(= 0)的类型,则使用let before定义相同的超时。所以有一个循环引用。让我们看看您的代码是如何执行的:
1 - 第一行调用该函数,在范围内创建超时,但它的值尚未定义。
2 - 在功能体中'超时'尝试设置为0.由于它在范围内,因此js无法创建全局变量(通常会这样做),并且赋值将引发错误。
修正?如果您希望功能块内的超时是本地的,只需将其重命名即可。
使用let就好了。
答案 1 :(得分:0)
这里的关键概念是“吊装”。
首先悬挂每个用'var'声明的变量,然后将其赋值;与“ let”不同,它不会提升变量,因此第一个js将评估分配的右侧;那时该变量还没有定义! 下一个稍有不同的代码与let一起使用:
let timeout
timeout = resetTimeout()
function resetTimeout () { timeout = 0; return timeout }
注意:由let或const声明的变量具有所谓的时间盲区(TDZ)(请参见http://2ality.com/2015/02/es6-scoping.html#the_global_object)
答案 2 :(得分:-1)
考虑到您的更新和此人的回答,我想声明您不需要重命名您的变量。因为let只能在一个图层上工作而不能深入到范围内,所以你可以在函数中声明新的变量超时。
let timeout = resetTimeout();
function resetTimeout(){let timeout = 0;返回超时; }
希望有所帮助。对不起,以前的回答。