如果我们尝试使用未声明但允许设置相同值的变量,为什么JavaScript会引发引用错误?
e.g
a = 10; //creates global variable a and sets value to 10 even though its undeclared
alert(b); // throws reference error.
那么为什么b,它的引用错误而不是a?
答案 0 :(得分:7)
这就是语言的运作方式。在非严格模式下,对未声明符号的赋值被隐式视为创建全局变量。在严格模式下,这是一个错误。
要使用严格模式,全局脚本块或函数应以语句开头:
"use strict";
即,一个由字符串"use strict"
组成的简单表达式语句。这将防止意外创建全局变量(仍然可以明确创建),并强加一些其他限制。
答案 1 :(得分:3)
变量声明,无论它们出现在何处,都会在任何声明之前处理 代码被执行。用var声明的变量的范围是它 当前执行上下文,它是封闭函数或者, 对于在任何函数外部声明的变量,global。
为未声明的变量赋值会隐式将其创建为 全局变量(它成为全局对象的属性)时 分配已执行。声明和声明之间的差异 未声明的变量是:
声明的变量在声明它们的执行上下文中受到约束。未声明的变量总是全局的。
- 醇>
在执行任何代码之前创建声明的变量。在分配给它们的代码之前,未声明的变量不存在 执行。强>
console.log(a); // Throws a ReferenceError.
console.log('still going...'); // Never executes.
var a;
console.log(a); // logs "undefined" or "" depending on browser.
console.log('still going...'); // logs "still going...".
- 声明的变量是其执行上下文(函数或全局)的不可配置属性。未声明的变量是 可配置的(例如可以删除)。
醇>由于这三个不同,未能声明变量会 很可能会导致意想不到的结果。因此建议 总是声明变量,无论它们是否在函数中 或全球范围。并且在ECMAScript 5严格模式下,分配给 未声明的变量会引发错误。
答案 2 :(得分:3)
a = 10;
内部声明var a
即在后台,它首先全局声明变量,然后设置该变量的值。
所以每当我们写作
a=10
究竟发生了什么:
var a;
a=10;
因此a
永远不会undefined
;
但在这种情况下,alert(b)
b
没有定义任何值,因此它仍为undefined
正如Pointy所说,
在非严格模式下,对未声明符号的赋值被隐式视为创建全局变量。在严格模式下,这是一个错误。
使用use strict