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