【问题标题】:JS: Why are variables allowed to be declared both with and without the `var` keyword...?JS:为什么允许使用和不使用 `var` 关键字声明变量...?
【发布时间】:2017-12-07 03:27:31
【问题描述】:

可以使用或不使用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!

为什么?

【问题讨论】:

标签: javascript initialization declaration var


【解决方案1】:

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

x = 1;

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

提及一个未声明的符号,如:

x;

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

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

而生效时
"use strict";

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

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

【讨论】:

  • 我喜欢这样。对我来说这似乎更合乎逻辑。 :)
【解决方案2】:

你可以在非严格模式下这样做

   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 在该行之前的任何位置定义,所以它不应该导致错误!

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2018-08-15
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多