【发布时间】:2018-07-20 22:20:41
【问题描述】:
为什么在这个 sn-p 中尝试访问 bar 不会导致引用错误?我已经阅读了试图解释 let 和 var 之间区别的问题/答案,但似乎没有一个可以解释顶部和底部示例的行为差异。
var foo;
let bar;
if( foo ) ()=>{}; // I expected this to be fine
if( bar ) ()=>{}; // I expected this to throw a reference error
console.log('finished');
(请随意回答这个问题,我的人生故事以及我为什么在下面提问)
我一直在努力改掉过度使用var 的坏习惯。在编写一些新代码时,我遇到了一个我以前从未见过的问题:使用if( myValue ) { ... } 会为未定义 myValue 引发引用错误。 “嗯,呵呵,我试试看有没有定义!”
我会声明myValue,并且在整个函数过程中,我可以为其赋值。在函数接近尾声时,我检查它是否有值,如果有,将执行一些额外的操作。
我记得在阅读有关 let 与 var 的文章时,var 基本上就像您在范围顶部为您的价值创建了容器一样,而我认为它会在您声明它的时间,但似乎在您分配它时这样做。所以,我可以使用var myValue;、let myValue = undefined 或if( typeof myValue !== 'undefined' ) { .. }。我知道最后一个是确保此类事情不再发生的最佳选择,即使它很丑陋。
然后,我写了上面的小sn-p来向同事解释这个错误......并且它起作用了?!?我试图弄清楚我可能错过的到底发生了什么,因为我想确切地了解哪里出了问题并从中吸取教训。但我现在真的很摸不着头脑,如果我不是更早的话,因为我认为我不仅发现了问题,而且解决了它……只是发现它可能只是一些无关紧要的事情。
附带说明:我的代码确实用一个let 声明了多个变量,它们之间使用逗号。这可能是一个因素吗?我确实多次重新阅读了这些声明,它们的格式都正确:
let value1 = 3,
value2,
value3 = 982,
// ...
myValue; // Add ` = undefined` to stop the Reference Error
// ...
if( myValue ) { /* ... */ } // Reference Error thrown here
【问题讨论】:
-
不读取任何文本:未初始化的变量被初始化为
undefined。换句话说,let x = undefined;和let x;是相同的(不包括异常情况) -
@ASDFGerte 看来我遇到了某种怪异的情况。在我的底部示例中是否有任何可能指向这些异常案例之一的方向?底部是添加
x = undefined而不是仅仅声明 x 解决了参考错误问题,顶部问题的示例是我写的 sn-p 以显示原始问题是什么,并且没有我的行为预计基于问题的解决方案。 -
我想到的案例并不是偶然发生的,我不知道有什么可以立即解释你的行为。我最好的猜测是您的列表中有一个分号:
let value1 = 3; myValue;。代码将另外处于非严格模式,并且您不小心对全局变量进行了操作。 -
@ASDFGerte 我也曾寻找过。我看到的唯一可能奇怪的是分配给布尔表达式结果的变量,所以我在布尔表达式周围添加了一些括号,以确保我没有操作顺序问题,但没有发现任何区别。但是,如果是这种情况,变量不会抛出引用错误吗,因为它现在是全局 var 而不是 let 并且默认为 undefined?