我阅读了许多文章,发现讨论这里列出的要点很有帮助。如果一个问题的时间太长,我会将它们拆分并重新发布,但由于它们是相关的,而且时间不长,我认为将它们合并为一个问题是很有意义的。
1。
首要任务是定义在全局范围内发生什么事情。
我从this收集到什么东西在全局范围内,什么时候可以在任何.js文件中的任何位置访问。
2。
看这个page
此处的术语“全局对象”(或标准内置对象)不是 与全局对象混淆。这里,“全局对象”指的是 范围内的对象。
我将其解释为意味着内置对象在全局范围内(如上所定义)。
可以使用以下操作符访问全局对象本身 全球范围。实际上,全局范围包括属性 全局对象,包括继承的属性(如果有)。
最后一句话几乎威胁到我的理解。我可以确认全局范围不完全由全局对象的属性组成吗?因为上一段说内置对象也处于全局范围内,所以它们不是全局对象的属性。
3。
全局范围内的其他对象由用户创建 脚本或由主机应用程序提供。可用的主机对象 API参考中记录了浏览器上下文中的内容。
当我将.js文件连接到.html文件时,它将文件连接到DOM API,该API使window
(全局对象)处于全局范围内。这是表达正在发生的事情的正确方法吗?
4。
MDN提到了全局变量。 MDN说,在浏览器中,所有全局变量都是全局对象的成员。我以为全局变量是全局对象属性的另一种说法(无论您是在浏览器中还是在node.js
中)。我在想的是真的吗?
答案 0 :(得分:1)
JavaScript具有多种全局变量。至少有 :
(这些命令是有序的,因此,如果在所有三个级别上使用相同的名称,则在全局范围内使用标识符时所得到的名称将是#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开始,它不再存在,它引入了未连接到全局对象的全局变量(在全局范围内的let
,const
和class
声明)。
在注释中出现了有关全局对象是否从原型继承的问题。答案是:它取决于主机环境,但是在我所看到的环境中,绝对可以。实际上,通常有多层。您可以使用Object.getPrototypeOf
和Object.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/)