我可以阐明全局范围,全局对象,全局对象和全局变量的术语吗?

时间:2020-07-30 17:12:47

标签: javascript

我阅读了许多文章,发现讨论这里列出的要点很有帮助。如果一个问题的时间太长,我会将它们拆分并重新发布,但由于它们是相关的,而且时间不长,我认为将它们合并为一个问题是很有意义的。

1。

首要任务是定义在全局范围内发生什么事情。
我从this收集到什么东西在全局范围内,什么时候可以在任何.js文件中的任何位置访问。

2。

看这个page

此处的术语“全局对象”(或标准内置对象)不是 与全局对象混淆。这里,“全局对象”指的是 范围内的对象。

我将其解释为意味着内置对象在全局范围内(如上所定义)。

可以使用以下操作符访问全局对象本身 全球范围。实际上,全局范围包括属性 全局对象,包括继承的属性(如果有)。

最后一句话几乎威胁到我的理解。我可以确认全局范围不完全由全局对象的属性组成吗?因为上一段说内置对象也处于全局范围内,所以它们不是全局对象的属性。

3。

全局范围内的其他对象由用户创建 脚本或由主机应用程序提供。可用的主机对象 API参考中记录了浏览器上下文中的内容。

当我将.js文件连接到.html文件时,它将文件连接到DOM API,该API使window(全局对象)处于全局范围内。这是表达正在发生的事情的正确方法吗?

4。

MDN提到了全局变量。 MDN说,在浏览器中,所有全局变量都是全局对象的成员。我以为全局变量是全局对象属性的另一种说法(无论您是在浏览器中还是在node.js中)。我在想的是真的吗?

1 个答案:

答案 0 :(得分:1)

JavaScript具有多种全局变量。至少有

  1. 是全局对象的继承属性的全局变量。
  2. 全局对象的拥有属性;这包括内置的全局变量。
  3. 不是全局对象属性的全局变量。

(这些命令是有序的,因此,如果在所有三个级别上使用相同的名称,则在全局范围内使用标识符时所得到的名称将是#3中的名称。)

例如:

var theVar;
let theLet;

const hasOwn = Object.prototype.hasOwnProperty;

// On browsers, a global created because an element has an `id` (or in some cases
// `name`) is an inherited property of the global object (note that IE and Legacy
// Edge have older behavior)
console.log("theDiv:");
console.log("theDiv" in this);            // true
console.log(hasOwn.call(this, "theDiv")); // false

// `var` at global scope creates an "own" property of the global object
console.log("theVar:");
console.log("theVar" in this);            // true
console.log(hasOwn.call(this, "theVar")); // true

// `let`, `const`, and `class` declarations at global scope create globals that
// are not properties of the global object
console.log("theLet:");
console.log("theLet" in this);            // false
console.log(hasOwn.call(this, "theLet")); // false

// The built-in globals are own properties of the global object:
console.log("Array:");
console.log("Array" in this);             // true
console.log(hasOwn.call(this, "Array"));  // true
console.log("undefined:");
console.log("undefined" in this);             // true
console.log(hasOwn.call(this, "undefined"));  // true

// Here's an exmaple of the fact that when the same name is used at all levels,
// the inner most (`let` in this case) wins:
const div = document.createElement("div");
div.id = "example";
document.body.appendChild(div); // Inherited global because of `id`
this.example = "own example";   // Global that's an own property
let example = "let example";    // Global created via `let`

console.log("Priority:");
console.log(example === "let example"); // true, innermost wins
.as-console-wrapper {
    max-height: 100% !important;
}
<div id="theDiv"></div>
<div id="example"></div>

设置好舞台...

我阅读了许多文章,发现讨论这里列出的要点很有帮助。如果一个问题的时间太长,我会将它们拆分并重新发布,但由于它们是相关的,而且时间不长,我认为将它们合并为一个问题是很有意义的。

1。

首要任务是定义在全局范围内发生什么事情。
我从this收集了什么东西在全局范围内,什么时候都可以在任何.js文件中的任何位置访问它。

在同一领域中运行的任何JavaScript代码,是的。 Web worker是与您的页面相关但在单独的领域中运行的JavaScript代码的示例。同样,即使选项卡的全局环境可以相互访问(例如,父窗口访问子窗口),它们的全局环境也位于不同的领域。

看这个page

此处的术语“全局对象”(或标准内置对象)不是 与全局对象混淆。这里,“全局对象”指的是 范围内的对象。

我将其解释为意味着内置对象在全局范围内(如上所定义)。

是的。 JavaScript自己的全局变量是全局对象的“自身”属性。例如,您可以看到in the spec Array构造函数被明确列出为全局对象的属性。

可以使用以下操作符访问全局对象本身 全球范围....

那只是主要是。主机环境确定this在全局范围内。在浏览器上,它是全局对象的代理,而不是全局对象本身的代理(the HTML spec中的更多内容),但是您几乎不需要关心它。

...实际上,全局范围由属性组成 全局对象,包括继承的属性(如果有)。

最后一句话几乎威胁到我的理解。我可以确认全局范围不完全由全局对象的属性组成吗?

纠正这些属性,而不是唯一。这些属性以及其他内容。

...由于上一段所述内置对象也处于全局范围内,因此它们不是全局对象的属性。

我看不到段落中所说的不是全局对象的属性。

全局范围内的其他对象由用户创建 脚本或由主机应用程序提供。可用的主机对象 API参考中记录了浏览器上下文中的内容。

当我将.js文件连接到.html文件时,它将文件连接到DOM API,该API使window(全局对象)处于全局范围内。这是真的吗?

浏览器确定this在全局范围内是什么(它是全局对象的代理),并在与window匹配的全局对象上创建一个名为this的属性。在全球范围内。

this提到了全局变量。什么是全局变量? MDN说,在浏览器中,所有全局变量都是全局对象的成员。 我以前认为全局变量只是全局对象属性的另一种说法(无论您使用的是浏览器还是node.js)。

过去曾经是真的,或者至少在大多数情况下是真的(我不保证没有例外)。从ES2015开始,它不再存在,它引入了未连接到全局对象的全局变量(在全局范围内的letconstclass声明)。


在注释中出现了有关全局对象是否从原型继承的问题。答案是:它取决于主机环境,但是在我所看到的环境中,绝对可以。实际上,通常有多层。您可以使用Object.getPrototypeOfObject.prototype.toString来查看它们是否在toString标签中给出了特殊名称:

const toString = Object.prototype.toString;
let obj = this;
let description = "global `this`";
while (obj) {
    console.log(`${description} (${toString.call(obj)})`);
    obj = Object.getPrototypeOf(obj);
    description = "prototype of " + description;
}

(今天的代码段遇到了麻烦;这是一个小提琴:https://jsfiddle.net/tjcrowder/zm1fhsve/

相关问题