JS:为什么允许使用和不使用 `var` 关键字来声明变量...?
JS: Why are variables allowed to be declared both with and without the `var` keyword...?
可以在使用和不使用 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!
为什么?
首先,您看到的是遗留行为。分配给未声明的符号传统上意味着,隐含地,应该创建(声明)全局符号并将其设置为给定值。于是
x = 1;
当x
没有被声明时被认为是全局符号的隐式实例化。
提及 未声明的符号,如:
x;
是一个错误,因为符号未声明。
在现代 JavaScript 中,当 "strict" 模式生效时
"use strict";
语句(或者因为其他影响,可能是Node.js代码),全局符号的隐式创建也是错误的。
通常,隐式全局符号实例化被认为是一个坏主意。浏览器中的全局符号 JavaScript 是相当有问题的,因为全局命名空间被严重污染了。值得庆幸的是,很容易将代码包装在函数范围内,为符号创建 "safe space",而不用担心浏览器强加奇怪的全局名称。
你可以在非严格模式下这样做
var a = 100; // this works!
b = 200; // and this does too!
对于非严格模式,someVar = someValue,如果someVar不存在,javascript会声明它并赋值给someVar。
对于这种情况:
var c;
d; // causes a reference error to occur!
第 1 行:变量 c; --> 声明 c,它是有效的语法。
第 2 行:d; --> 你访问 d,但 d 未定义 --> 导致错误!!!
假设 d 在该行之前的任何地方定义,所以它不应该导致错误!!
可以在使用和不使用 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!
为什么?
首先,您看到的是遗留行为。分配给未声明的符号传统上意味着,隐含地,应该创建(声明)全局符号并将其设置为给定值。于是
x = 1;
当x
没有被声明时被认为是全局符号的隐式实例化。
提及 未声明的符号,如:
x;
是一个错误,因为符号未声明。
在现代 JavaScript 中,当 "strict" 模式生效时
"use strict";
语句(或者因为其他影响,可能是Node.js代码),全局符号的隐式创建也是错误的。
通常,隐式全局符号实例化被认为是一个坏主意。浏览器中的全局符号 JavaScript 是相当有问题的,因为全局命名空间被严重污染了。值得庆幸的是,很容易将代码包装在函数范围内,为符号创建 "safe space",而不用担心浏览器强加奇怪的全局名称。
你可以在非严格模式下这样做
var a = 100; // this works!
b = 200; // and this does too!
对于非严格模式,someVar = someValue,如果someVar不存在,javascript会声明它并赋值给someVar。
对于这种情况:
var c;
d; // causes a reference error to occur!
第 1 行:变量 c; --> 声明 c,它是有效的语法。 第 2 行:d; --> 你访问 d,但 d 未定义 --> 导致错误!!! 假设 d 在该行之前的任何地方定义,所以它不应该导致错误!!