当我们有普通的 javascript 对象时,我们可以使用类似objectName.proprtyName. 如果我们只使用propertyName,那么我们会得到如下错误 -const myObj = { userIdName : "John"};console.log(myObj.userIdName); //Johnconsole.log(userIdName); //error "Not defined"但是,在内置window对象的情况下,我们可以同时使用window.propertyName和 ,propertyName如下所示 -console.log(window.alert);console.log(alert);//both return same result究竟是什么导致了window对象的这种行为?我们可以为任何显式构建的对象(如第一个片段中的对象)复制相同的行为吗?(虽然没有人愿意污染全局范围,但我只是有这个查询)编辑- 我收到评论说这个问题是另一个问题的重复。这个问题与我的答案非常相似,除了一个区别 - 我正在寻找一种方法来复制对象的相同的全局可访问行为window。
1 回答
RISEBY
TA贡献1856条经验 获得超5个赞
究竟是什么导致了
window
对象的这种行为?
JavaScript 有两种主要类型的环境记录(“保存”名称 -> 值关联的构造):声明性记录和对象记录。
声明性环境记录以特定于实现的方式存储这些关联。这是最常见的环境记录类型,例如在调用函数时创建。
正如名称所示,对象环境记录使用实际的 JavaScript 对象作为“后端” 。这意味着该环境中的每个条目都成为该“绑定对象”的属性,反之亦然。
全局环境使用这样的对象环境,并且该绑定对象可通过window
浏览器使用。
我们可以为任何显式构建的对象(如第一个片段中的对象)复制相同的行为吗?
with
不推荐使用的语句可能仍然存在,并使用提供的对象作为绑定对象创建对象环境记录。从规格来看:
该
with
语句将计算对象的对象环境记录添加到正在运行的执行上下文的词法环境中。然后它使用这个增强的词法环境执行一条语句。最后,它恢复了原始的词汇环境。
var obj = {foo: 42};
with (obj) {
console.log(foo);
}
添加回答
举报
0/150
提交
取消