声明没有var关键字和逻辑OR的变量

Joh*_*tta 8 javascript

在使用逻辑OR声明对象时,我会遇到奇怪的行为.

my_var = my_var || {}; // throws TypeError
Run Code Online (Sandbox Code Playgroud)

如果我添加var关键字

var my_var = my_var || {}; // returns empty object
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我似乎无法找到解释.my_var是全球范围的,那么为什么要var改变这种行为呢?

Dan*_*lig 5

第一个示例尝试my_var通过从名为my_var(或空对象)的标识符中读取值来为全局对象上的属性分配.但是,标识符my_var未在该点定义,因此失败.

在第二个例子中,由于javascript变量提升的工作原理my_var,当你通过赋值变量读取变量时,变量已经被声明了.

另请看这个例子:

a = a; // fails, undeclared identifier
a = 0;
Run Code Online (Sandbox Code Playgroud)

使用var关键字,它将起作用!

b = b; // succeeds allthough identifier undeclared?!
var b = 0;
Run Code Online (Sandbox Code Playgroud)

这是因为可变提升将把它变成这样:

var b; // declaration of b hoisted to the top of scope
b = b;
b = 0;
Run Code Online (Sandbox Code Playgroud)