如果我在网页上打开JavaScript控制台并添加变量:
var abc = "Hello";
Run Code Online (Sandbox Code Playgroud)
Javascript将该属性附加到window对象,因此我可以简单地通过window.abc或直接访问该对象abc
console.log(window.abc)
console.log(abc)
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试通过该window对象访问尚未定义的内容
console.log(window.notdefinedyet)
> undefined
Run Code Online (Sandbox Code Playgroud)
它只是返回未定义。所以如果我这样做
console.log(notdefinedyet)
Run Code Online (Sandbox Code Playgroud)
为什么这是一个错误而不仅仅是错误undefined?
因为尝试读取未声明标识符的值是ReferenceError。从根本上说,这与尝试从对象不具有的属性中读取属性是不同的操作。
尝试使用未声明的标识符通常是一个错误(例如,错字)。这就是为什么ES5的严格模式使得向未声明的标识符分配ReferenceError的原因(而不是原来的行为-仍处于宽松模式以实现向后兼容性-在其中创建新的全局变量,我称之为“隐式全局的恐怖”)。
一个人可能会争论(很多人都说过),试图从一个对象没有的属性中获取属性也是一个错误。但是undefined在这种情况下,获取而不是错误通常非常有用。是否有人同意这种区分,这就是定义JavaScript的方式。
可能值得一提的是,在全局对象上创建属性的这种全局变量声明业务是为保持向后兼容性而必须保留的旧有行为,但与TC39中当前语言设计思想(JavaScript标准背后的委员会)不一致)。较新的构造(如let,const和)class即使在全局范围内使用,也不会在全局对象上创建属性(尽管它们确实创建了全局变量):
var a = 1;
let b = 2;
console.log("a" in window); // true
console.log("b" in window); // false
console.log(a); // 1
console.log(b); // 2Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |