窗口对象包含什么?

时间:2016-11-27 01:56:12

标签: javascript

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

我将this的值记录到控制台,并看到下面图片中显示的巨大列表。

我看到的列表包含什么,以及如何填充?

2 个答案:

答案 0 :(得分:9)

首先,简要介绍读者对词汇环境的看法,以及它与全球环境的关系,以及全球环境与全球对象的关系。

词汇环境包括:

  • 环境记录,用于存储在环境范围内创建的标识符绑定
  • 对外部环境的引用,
  • 对其中包含的任何环境的引用。

词法环境继承在其包含的环境中声明的变量定义,并在每次计算try语句的函数声明,块语句或catch子句时创建。变量定义不能在它们定义的词汇环境之外访问。

以下示例:

  • 使用var声明定义一个全局变量,初始化为一个函数表达式,它创建一个新的词法环境,
  • 在新环境中定义一个变量,再次使用var声明,这次初始化为字符串值,
  • 表明该变量在其定义的环境之外无法访问:
var hello = function() {
    var world = "fubar";
    console.log(world); // "fubar";
}

console.log(world); // ReferenceError: world is not defined

全局环境是一个词汇环境,其外部环境引用为null,其中包含关联的全局对象,其属性提供了一些全局环境的标识符绑定,特别是排除使用letconst声明定义的变量,以及其他可能的排除项。

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

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

现在,在上下文中回答你的问题:

  

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

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

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

此答案中包含的信息应符合ECMAScript 2015 Language Specification,其中还包含此处使用的大多数术语的定义,我强烈建议您在任何时候浏览该文档一些轻读的心情。

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

答案 1 :(得分:-2)

这些是窗口对象中的所有函数。

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

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

例如,

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

会提醒o对象,而不是窗口。

您可以直接调用位于相同上下文中的函数,这就是您可以在控制台中键入Infinity的原因,并返回Infinity,它是窗口的一部分。

JavaScript也会查找父对象(本例中为窗口)到声明的对象,因此在浏览器控制台中,这可以工作:

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