为啥在 JavaScript 中将全局变量添加到窗口对象?

     2023-02-22     257

关键词:

【中文标题】为啥在 JavaScript 中将全局变量添加到窗口对象?【英文标题】:Why are global variables added to a window object in JavaScript?为什么在 JavaScript 中将全局变量添加到窗口对象? 【发布时间】:2021-08-18 23:31:45 【问题描述】:

为什么在 JavaScript 中将全局变量添加到窗口对象中?

var a = 1;
console.log(window.a);

ECMAScript 2015 语言规范没有说声明的 var 或函数被添加到窗口全局对象中。 但是,我想知道为什么将声明为 var 的全局变量作为属性添加到 window 对象中。

我很好奇的是它与 ECMAScript 语言规范无关?

我使用了翻译器,所以如果很奇怪,请理解。

【问题讨论】:

global 用于 NodeJS(服务器端)。对于浏览器,globalwindow "ECMAScript 2015 语言规范没有说声明的 var 或函数被添加到窗口全局对象中。" [需要引用] 因为这是 ES1 的一部分,所以我'我不知道为什么你的东西 ES6 removed 它。或者您如何确定它不在规范中。 【参考方案1】:

实际上在规范here 中指出,当不存在这样的标识符时将变量分配给:

If IsUnresolvableReference(V) is true, then
  a. If V.[[Strict]] is true, throw a ReferenceError 
exception.
  b. Let globalObj be GetGlobalObject().
  c. Return ? Set(globalObj, V.[[ReferencedName]], W, false).

还有here,在CreateGlobalVarBinding中,叫做when a variable is declared at the top level of a script。

6. Let varDeclarations be the VarScopedDeclarations of script.
...
18. For each String vn of declaredVarNames, do
  a. Perform ? env.CreateGlobalVarBinding(vn, false).

全局对象可以是浏览器中的window,或者web worker中的self,或者the Node global等。

【讨论】:

我相信问题在于为什么变量的范围是window。这就解释了为什么***变量设置为global @choz "这就解释了为什么***变量设置为全局" ??? “让 globalObj 成为 GetGlobalObject()。”绝对不是说“全球”。 GetGlobalObject抽象操作返回全局对象,在浏览器环境中全局对象为window。所有这些答案都解释了为什么在window 上设置了一个变量。 你怎么知道是window?对于网络工作者,也可以是 self @choz 由于 OP 询问window,我认为可以安全地假设问题的上下文是全局对象为window 的浏览器。如果 OP 询问网络工作者,我觉得他们不会提到 window 作为添加全局属性的东西。 @VLAZ 我实际上指的是 OP 怎么可能知道 GetGlobalObject 指的是浏览器的 window,或者其他的东西。但是,最后的编辑应该回答了这个问题。【参考方案2】:

我认为var 导致属性被添加到全局对象(在您提供的示例中)的原因与 JavaScript 中的环境如何linked 有关;它们由外部引用链接,但全局环境没有外部引用。也许将它们作为属性绑定到全局对象的选择源于全局环境中缺乏外部引用。

全局作用域是“最外层”作用域——它没有外部作用域。它的 环境是全球环境。每个环境都是相互关联的 通过一系列环境与全局环境 由外部引用链接。全局的外部参考 环境是null

来源:https://2ality.com/2019/07/global-scope.html#the-global-object

【讨论】:

不,在全局上下文中声明的vars 只是被添加到全局对象中。这就是它的工作原理。有没有链接对这里的任何东西都没有影响。 @VLAZ 我的答案是唯一一个试图回答他问题的“为什么”方面的答案。我知道它是如何工作的。问题是“为什么?” “为什么?”的答案是“因为规格是这样说的”。如果规范说不应该将变量添加到全局对象中,那么它们就不会添加。 That's how const and let work,例如。同样,不是因为任何链接。 @VLAZ 深入思考:为什么编写规范的人决定这样做?这就是问题的本质。这家伙不是在问规格如何,而是在问为什么它们是这样的。一个人或一群人有意识地决定这样做。是什么让他们当时做出了这样的决定? 不幸的是,“为什么以这种方式编写规范”不是主题。主要是因为它无法得到权威的回答,除了语言设计者进来并分享推理。或者其他任何人使用解释设计师推理的资源。举个例子:你的答案没有做到这一点。我们能做的就是猜测。也许当时的规范没有经过深思熟虑。 JS 是在 几天 中开发出来的,直到今天,Brendan Eich 提到很多人都提到了这一事实。话虽如此,OP 声称根据规范,vars 不应转到window,但这是错误的。

java示例代码_使用Rhino在Javascript中将Java类中的方法添加为全局函数

java示例代码_使用Rhino在Javascript中将Java类中的方法添加为全局函数 查看详情

在Javascript中将多个变量分配给相同的值?

】在Javascript中将多个变量分配给相同的值?【英文标题】:AssignmultiplevariablestothesamevalueinJavascript?【发布时间】:2013-06-0305:51:33【问题描述】:我在一个JavaScript文件的全局范围内初始化了几个变量:varmoveUp,moveDown,moveLeft,moveRight;... 查看详情

为啥我需要在 JavaScript 中将 unix 时间戳乘以 1000?

】为啥我需要在JavaScript中将unix时间戳乘以1000?【英文标题】:WhydoIneedtomultiplyunixtimestampsby1000inJavaScript?为什么我需要在JavaScript中将unix时间戳乘以1000?【发布时间】:2011-06-0806:03:22【问题描述】:我确信我必须为JavaScript中的每... 查看详情

在 JavaScript(特别是 NativeScript)中添加全局变量/函数

】在JavaScript(特别是NativeScript)中添加全局变量/函数【英文标题】:Addingaglobalvariable/functioninJavaScript(specificallyNativeScript)【发布时间】:2015-10-0817:35:55【问题描述】:我正在学习如何使用NativeScript编写应用程序。我相信最好的... 查看详情

在javascript中将多个变量分配给相同的值(代码片段)

我在JavaScript文件中初始化了全局范围内的几个变量:varmoveUp,moveDown,moveLeft,moveRight;varmouseDown,touchDown;我需要将所有这些变量设置为false,这是我目前拥有的代码:moveUp=false;moveDown=false;moveLeft=false;moveRight=falsemouseDown=false;touch 查看详情

为啥全局变量不添加到浏览器的窗口对象? [复制]

】为啥全局变量不添加到浏览器的窗口对象?[复制]【英文标题】:Whygloballetvariablesnotaddedtowindowobjectofbrowser?[duplicate]为什么全局变量不添加到浏览器的窗口对象?[复制]【发布时间】:2020-06-0608:41:39【问题描述】:考虑下面我在... 查看详情

在 Browserify 中将模块公开为全局变量

】在Browserify中将模块公开为全局变量【英文标题】:ExposemoduleasglobalvariableinBrowserify【发布时间】:2016-04-1412:36:57【问题描述】:我有third-party-module-b使用third_party_module_a全局并且有require(\'third-party-module-a\');在入口点。问题是third... 查看详情

为啥我们在java中将变量声明为私有[重复]

】为啥我们在java中将变量声明为私有[重复]【英文标题】:whywearedeclaringvariablesasprivateinjava[duplicate]为什么我们在java中将变量声明为私有[重复]【发布时间】:2013-04-1605:12:55【问题描述】:通常在javabean类中,我们将变量声明为私... 查看详情

为啥我们在 PHP 中将一些变量声明为“$_variablename”...? [复制]

】为啥我们在PHP中将一些变量声明为“$_variablename”...?[复制]【英文标题】:WhywedeclaresomevariablesinPHPaslike"$_variablename"...?[duplicate]为什么我们在PHP中将一些变量声明为“$_variablename”...?[复制]【发布时间】:2013-04-0906:32:5... 查看详情

如何在 Visual C++ 中将托管变量用作全局变量?

】如何在VisualC++中将托管变量用作全局变量?【英文标题】:HowtousemanagedvariableasglobalinVisualC++?【发布时间】:2014-05-2919:42:29【问题描述】:我正在用VisualC++编写MFC应用程序并使用一个C#库。DoutoI结合了非托管和托管的类和变量。... 查看详情

malloc 和全局变量声明在 C 中将它们的变量分配到哪里? [复制]

】malloc和全局变量声明在C中将它们的变量分配到哪里?[复制]【英文标题】:WheredoesmallocandglobalvariabledeclarationallocatestheirvariabletoinC?[duplicate]【发布时间】:2014-08-0910:55:09【问题描述】:在一个简单的C程序中,如果我malloc一个指... 查看详情

在 JSP 中将 JavaScript 变量分配给 Java 变量

】在JSP中将JavaScript变量分配给Java变量【英文标题】:AssignJavaScriptvariabletoJavaVariableinJSP【发布时间】:2012-01-0606:57:03【问题描述】:你好,我正在尝试将javascript变量的值分配给java变量。但我不知道如何做到这一点?比如说我有... 查看详情

javascript相关知识

定义: 1.使用var关键字定义 2.其他跟Java类似变量类型 1.全局变量在js中没有定义在方法内部的变量 (在非严格模式下)在js的方法中,不添加var的变量也是全局变量 “userstrict”严格模式 2.局部变量在js中定义在方法内... 查看详情

为啥全局变量是邪恶的? [关闭]

】为啥全局变量是邪恶的?[关闭]【英文标题】:Whyareglobalvariablesevil?[closed]为什么全局变量是邪恶的?[关闭]【发布时间】:2013-10-1002:25:37【问题描述】:我试图找出为什么使用global被认为在python(以及一般编程)中是不好的做... 查看详情

如何在flutter中将token设置为全局变量?所以我可以随时随地访问令牌

】如何在flutter中将token设置为全局变量?所以我可以随时随地访问令牌【英文标题】:Howtosettokenasaglobalvariableinflutter?soicanaccessthetokenwhereveriwant【发布时间】:2020-09-2304:06:24【问题描述】:我使用Firebase身份验证构建了一个应用程... 查看详情

在 Django 中将 cache.clear() 添加到全局保存

】在Django中将cache.clear()添加到全局保存【英文标题】:Addingcache.clear()toglobalsaveinDjango【发布时间】:2016-10-2108:20:00【问题描述】:希望有人知道这样做的简单方法。是否可以在每次保存到任何模型时运行cache.clear()函数?我知道D... 查看详情

如何将有效负载值存储在全局变量中 - Objective-c

...方法中将有效负载值存储到全局变量中。将来,我需要从javascript函数(phonegap)中使用这个全局变量。notificat 查看详情

为啥 Typescript 在转译代码中将 .default() 添加到类构造函数中?

】为啥Typescript在转译代码中将.default()添加到类构造函数中?【英文标题】:WhyTypescriptadds.default()toclassconstructorintranspiledcode?为什么Typescript在转译代码中将.default()添加到类构造函数中?【发布时间】:2019-09-2921:21:40【问题描述】... 查看详情