未捕获的ReferenceError:在测试truthy时,var是未定义的

And*_*dez 3 javascript

所以,我总是使用构造类型来测试变量的存在:

if(foo){
   doThings();
}
Run Code Online (Sandbox Code Playgroud)

现在,我得到了一个

Uncaught ReferenceError: foo is undefined
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴

事实上var甚至从未被宣布过.我的问题是,这是正常的行为吗?我已经使用了很多次,我认为这不是第一次没有声明变量; 我几乎可以肯定我从来没有遇到过这个问题,它只是返回了假,并没有得到这个条件.

欢迎任何帮助和澄清.

Jam*_*ice 5

如果尚未声明变量,则尝试引用它将导致引用错误.

如果已声明变量但未赋值,则它将隐式具有该值,undefined并且您的代码将按预期工作.

在你的情况下,这是发生的事情:

  • 评估if声明 [if(Expression)Statement ]
    • 这涉及根据10.3.1评估Expression,它返回一个引用
    • 在返回的引用上 调用GetValue
      • 如果引用不可解析(它的值为undefined),则抛出引用错误
    • 将引用的值强制转换为布尔值

用于确定引用值的算法遍历嵌套词法环境链,直到它到达最外层上下文.当它到达该点并且仍未找到所提供标识符的绑定时,它返回其基值为的引用undefined.

当引用的基值是undefined该引用被称为" 不可解析 "时,并且当引用无法解析时,任何引用它的尝试都会(不出所料)导致引用错误.