JS:为什么允许使用和不使用`var`关键字声明变量...?

时间:2017-12-07 03:27:32

标签: javascript initialization declaration var

可以使用和不使用var关键字声明javascript变量。

var a = 100; // this works!
    b = 200; // and this does too!

也可以在没有初始化的情况下声明变量。

var c;       // this is just as acceptable! 

但是为什么对于没有var的变量,同样的情况也是如此,在没有初始化的情况下声明。

var c; 
    d;       // causes a reference error to occur!

为什么?

2 个答案:

答案 0 :(得分:2)

首先,您所看到的是遗留行为。对未声明符号的赋值传统上意味着应该创建(声明)全局符号并将其设置为给定值。因此

x = 1;

当未声明x时,将其视为全局符号的隐式实例化。

提及未声明符号的,如:

x;

是错误,因为符号未声明。

在现代JavaScript中,当“严格”模式因

而生效时
"use strict";

语句(或者由于其他影响,可能是Node.js代码的情况),隐式创建全局符号也是错误的。

通常,隐式全局符号实例化被认为是一个坏主意。浏览器JavaScript中的全局符号很成问题,因为全局命名空间受到严重污染。值得庆幸的是,在函数范围中包装代码很容易为符号创建“安全空间”,而不必担心浏览器会强加怪异的全局名称。

答案 1 :(得分:0)

您可以在非严格模式下执行此操作

   var a = 100; // this works!
        b = 200; // and this does too!

对于非严格模式,someVar = someValue,如果someVar不存在,javascript将声明它并为someVar分配someValue。

对于那种情况:

var c; 
    d;       // causes a reference error to occur!

第1行:var c; - >声明c,它是有效的语法。 第2行:d; - >你访问d,但d是未定义的 - >导致错误!!! 假设d在该行之前的任何地方定义,因此它不应该导致错误!!