【问题标题】:Window object properties behavior窗口对象属性行为
【发布时间】:2021-03-06 13:00:58
【问题描述】:

当我们有普通的 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 对象的这种行为?我们可以为任何显式构建的对象(如第一个 sn-p 中的对象)复制相同的行为吗? (虽然没有人愿意污染全局范围,但我只有这个查询)

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

【问题讨论】:

标签: javascript javascript-objects window-object


【解决方案1】:

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

JavaScript 有两种主要类型的环境记录(用于“保存”名称 -> 值关联的构造):declarative recordobject record

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

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

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

我们能否为任何显式构建的对象复制相同的行为,例如第一个 sn-p 中的对象?

已弃用的with statement 可能仍然存在,并使用提供的对象作为绑定对象创建对象环境记录。来自spec

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2021-12-19
    • 2023-03-23
    相关资源
    最近更新 更多