0

当我们有普通的 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对象的相同全局可访问行为。

4

1 回答 1

2

究竟是什么导致了window对象的这种行为?

JavaScript 有两种主要类型的环境记录(一种“保存”名称 -> 值关联的结构):声明性记录对象记录

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

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

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

我们可以为任何显式构建的对象(如第一个片段中的对象)复制相同的行为吗?

不推荐使用的with语句可能仍然存在,并使用提供的对象作为绑定对象创建对象环境记录。从规格

with语句将计算对象的对象环境记录添加到正在运行的执行上下文的词法环境中。然后它使用这个增强的词法环境执行一条语句。最后,它恢复了原来的词法环境。

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

于 2020-11-23T19:18:28.493 回答