Window 对象属性行为

Window object properties behavior

当我们有普通的 javascript 对象时,我们可以使用像 objectName.proprtyName 这样的语法访问那里的属性。如果我们只使用 propertyName ,那么我们会得到如下错误 -

const myObj = {
  userIdName : "John"
};

console.log(myObj.userIdName); //John
console.log(userIdName); //error "Not defined"

但是,对于内置 window 对象,我们可以单独使用 window.propertyNamepropertyName,如下所示 -

console.log(window.alert);
console.log(alert);

//both return same result

究竟是什么导致了 window 对象的这种行为?我们可以为任何显式构建的对象复制相同的行为,例如第一个片段中的对象吗? (虽然没有人想污染全局范围,但我只有这个查询)

编辑 - 我收到评论说这个问题与 重复。这个问题与我的回答非常相似,除了一个区别——我正在寻找一种方法来复制 window 对象的相同全局可访问行为。

What exactly is responsible for this behavior of the window object?

JavaScript 有两种主要类型的 环境记录 (“保持”名称 -> 值关联的结构):declarative record and an object record.

声明性环境 记录以特定于实现的方式存储这些关联。这是最常见的环境记录类型,例如在调用函数时创建。

对象环境记录如名称所示使用实际的JavaScript对象作为“后端”。这意味着该环境中的每个条目都成为该“绑定对象”的 属性,反之亦然。

全局环境使用这样的对象环境,并且绑定对象可通过浏览器中的window获得。

Can we replicate the same behavior for any explicitly built object like the object in the first snippet?

可以使用已弃用的 with statement still exists and creates an object environment record using the provided object as a binding object. From the spec:

The with statement adds an object Environment Record for a computed object to the lexical environment of the running execution context. It then executes a statement using this augmented lexical environment. Finally, it restores the original lexical environment.

var obj  = {foo: 42};
with (obj) {
  console.log(foo);
}