为什么 `window.num` 返回 `undefined` 而 `num` 抛出 `ReferenceError`?
js 中的 window 对象的特殊性
在 js 中,window 对象代表当前浏览器的窗口。它提供了全局作用域的访问权,允许开发者轻松访问全局变量和方法。然而,window 对象还有一个鲜为人知且令人困惑的特性:它可以访问不存在的属性。
为什么可以直接通过 window 对象访问不存在的属性?
让我们看一个例子。在给定的代码段中:
console.log(window.num); // undefined console.log(num); // Uncaught ReferenceError: num is not defined
window.num 返回 undefined,这表明 num 属性不存在。但是,直接使用 num 却会抛出一个 referenceerror。这是为什么呢?
这种特性实际上是 js 语言设计的一部分。当通过 . 语法访问一个不存在的属性时,js 引擎会首先在当前作用域中查找。如果没有找到,它将继续搜索原型链。
window 对象是全局对象,位于原型链的顶端。因此,当它找不到一个属性时,它将返回 undefined 而不是抛出错误。
执行原理
js 通过以下步骤执行 . 语法访问属性:
[[getownproperty]] 方法用于在对象或原型链中检索一个属性。如果属性存在,[[getownproperty]] 就会返回其值,否则就返回 undefined。
综上所述,window 对象可以点出任意名称的属性是因为 js 会自动搜索原型链,并返回不存在属性的 undefined 值。
以上就是为什么 `window.num` 返回 `undefined` 而 `num` 抛出 `ReferenceError`?的详细内容,更多请关注其它相关文章!