Javascript 窗口对象包含什么?

Javascript 窗口对象包含什么?,javascript,Javascript,我在全局范围内探索this关键字,发现该上下文中的this指的是窗口 我将this的值记录到控制台中,看到下图中显示了一个巨大的列表 我看到的列表包含了什么,它是如何填充的 这些都是作为窗口对象一部分的函数 这样想吧。所有函数都是对象的一部分。”运行代码中的“in”返回函数运行的对象上下文。它可能是定义函数的对象,但“this”可以在代码中动态更改,因此更准确地说,它是函数运行所在的对象上下文 窗口是浏览器中的全局对象,因此当您不在作为窗口子对象一部分的函数内时,您处于窗口对象上下文中 比如说,

我在全局范围内探索
this
关键字,发现该上下文中的
this
指的是窗口

我将
this
的值记录到控制台中,看到下图中显示了一个巨大的列表

我看到的列表包含了什么,它是如何填充的


这些都是作为窗口对象一部分的函数

这样想吧。所有函数都是对象的一部分。”运行代码中的“in”返回函数运行的对象上下文。它可能是定义函数的对象,但“this”可以在代码中动态更改,因此更准确地说,它是函数运行所在的对象上下文

窗口是浏览器中的全局对象,因此当您不在作为窗口子对象一部分的函数内时,您处于窗口对象上下文中

比如说,

var o = { test: function(){ alert(this) } }
o.test();
将警告o对象,而不是窗口

您可以直接调用同一上下文中的函数,这就是为什么您可以在控制台中键入Infinity,它返回Infinity,这是窗口的一部分

JavaScript还将查找声明对象的父对象(在本例中为窗口),因此在浏览器控制台中,这起作用:

var o = { test: function(){ alert(Infinity) } }
o.test();

首先,向读者简要介绍什么是词汇环境,以及词汇环境与全局环境的关系,以及全局环境与全局对象的关系


词汇环境包括:

  • 环境记录,存储在环境范围内创建的标识符绑定
  • 对外部环境的引用,以及
  • 对中包含的任何环境的引用
词法环境继承在其所包含的环境中声明的变量定义,并在每次计算try语句的函数声明、块语句或catch子句时创建。在定义变量的词汇环境之外,无法访问变量定义

下面是一个例子:

  • 使用
    var
    声明定义全局变量,初始化为函数表达式,创建新的词汇环境
  • 在新环境中定义变量,再次使用
    var
    声明,这次初始化为字符串值,然后
  • 演示在定义变量的环境之外无法访问该变量:

全局环境是一个词法环境,其外部环境引用为空,包括一个关联的全局对象,其属性提供了一些全局环境的标识符绑定,特别排除使用
let
const
声明定义的变量,以及其他可能的排除

var hello = "world";
console.log(hello, window.hello); // "world", "world"

let foo = "bar";
console.log(foo, window.foo) // "bar", undefined

现在,根据上下文回答您的问题:

我看到的列表包含了什么,它是如何填充的

您看到的列表包含全局对象的属性,其中包括:

  • 浏览器提供的预填充标识符绑定-其中一些是标准的,其他的是特定于JavaScript引擎或浏览器实现的-
  • 由当前页面上运行的脚本设置的全局变量,或
  • 由您可能已安装的浏览器扩展设置的全局变量

此答案中包含的信息应符合,其中还包含此处使用的大多数术语的定义,我强烈建议您随时浏览该文档,以便轻松阅读


如果您发现此答案与ECMAScript语言规范之间存在差异,请随意编辑此答案以符合要求。

TinyGiant的回答表明,此问题的格式不太宽泛。
var hello = "world";
console.log(hello, window.hello); // "world", "world"

let foo = "bar";
console.log(foo, window.foo) // "bar", undefined