原文: https://2ality.com/2019/07/global-scope.html

翻译: 刘小夕

在这篇博文中,我们将研究 JavaScript 的全局变量是如何工作的。如: scripts的范围,所谓的全局对象等等。

1.作用域

变量的词法作用域(简称:作用域)是可以访问它的程序的区域。 JavaScript 的作用域是静态的(它们在运行时不会改变)并且它们可以嵌套 - 例如:

function func() { // (A)

const foo = 1;

if (true) { // (B)

const bar = 2;

}

}

if 语句引入的作用域(行B)嵌套在函数 func()(行A)的作用域内。

在示例中, func 是 if 的外层作用域。

2.词法作用域

在 JavaScript 语言规范中,作用域是通过词法作用域“实现”的。它们由两部分组成:

  • 将变量名映射到变量值的环境记录(可以想象成是字典)。这是 JavaScript 存储变量的地方。环境记录中的一个 key-value 条目称为绑定。

  • 对外部环境的引用 - 表示当前环境所代表的作用域的外部作用域的环境。

因此,嵌套作用域树可以由嵌套环境树表示。

3.全局对象

全局对象是一个对象,其属性是全局变量。

  • 无处不在: globalThis

  • 全局对象的其他名称取决于平台和语言构造:

    • window:是引用全局对象的经典方式,但它只适用于普通浏览器环境; 不在 Node.js 和 WebWorkers 中。

    • self:在浏览器中随处可用,包括 WebWorkers。但是 Node.js 不支持它。

    • global:仅在 Node.js 中可用。

全局对象包含所有内置全局变量。

4.全局环境

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

全局环境结合了两个环境记录

  • 对象式环境记录,其作用类似于普通环境记录,但保持其绑定与对象同步。在这种情况下,对象是全局对象。

  • 声明式环境记录。

下图显示了这些数据结构。

接下来的两个小节将解释如何组合对象记录和声明式记录。

4.1创建变量

为了创建一个真正全局的变量,你必须处于全局作用域内 - 必须要在 scripts 的顶层:

  • 顶级 const, let 和 class 在声明式环境记录中创建绑定。

  • 顶级 var 和函数声明在对象式环境记录中创建绑定。

<script>

const one = 1;

var two = 2;

script>

<script>

// All scripts share the same top-level scope:

console.log(one); // 1

console.log(two); // 2

// Not all declarations create properties of the global object:

console.log(window.one); // undefined

console.log(window.two); // 2

script>

此外,全局对象包含所有内置全局变量,并通过对象式记录将它们给全局环境。

4.2读取/设置变量

当我们获取或设置变量并且两个环境记录都具有该变量的绑定时,声明式环境记录将获胜:

<script>

let foo = 1; // 声明式环境记录

globalThis.foo = 2; // 对象式环境记录

console.log(foo); // 1 (声明式记录获胜)

console.log(globalThis.foo); // 2

script>

5.模块环境

每个模块都有自己的环境,它存储所有顶级声明 - 包括导入。模块环境的外部环境是全局环境。

结论:为什么JavaScript既有全局变量又有全局对象?

通常认为将全局变量挂载到全局对象上是错误的。因此,较新的构造(如 const, let 和 classes)会创建正常的全局变量,不会成为全局对象的属性。(在 script作用域内时)。

值得庆幸的是,大多数用现代 JavaScript 编写的代码都存在于 ECMAScript 模块和 CommonJS模块中,每个模块都有自己的作用域。

js获取已知scripts中是否存在某变量_JS全局变量是如何工作的?相关推荐

  1. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。

    jsp结合SQLSERVER向数据库中的表添加图书信息. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中.需要对提交的信息进行修改,信息填入不 ...

  2. 已知空间中的三点 求三角形面积_【气宇轩昂】解三角形最值问题的四大模型尤其是第四种模型,简直不要太赞哦!!!...

    点击上方蓝色字体"高中数学王晖"关注王晖老师,免费获取各种知识干货和学习经验~~~您的点赞转发是对老师的最大鼓舞~~~ 距高考还有262天 1 三角函数有界性 在三角函数中,正弦函 ...

  3. [MATLAB]从已知矩阵中取出子阵

    首先要知道冒号表示法,如下: EX: 如上有4×6矩阵,假设我们要取出第一行,第二行,第四行,则可以有B=A([1 2 4],:) 假设要取出第一行,第二行,第四行的1-2列和4-6列,可以有B=A( ...

  4. 二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)

    二叉树的遍历(前序.中序.后序.已知前中序求后序.已知中后序求前序)   之前的一篇随笔(二叉树.前序遍历.中序遍历.后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前.中.后序的遍历顺序进 ...

  5. 已知前序中序输出后序(java)返回值是数组

    例子: 前序:1, 2, 3, 4, 5, 6(根左右) 中序:3, 2, 4, 1, 6, 5(左根右) 后序:3, 4, 2, 6, 5, 1(左右根) 1.先说根据前序中序求后序,前序总是沿着根 ...

  6. sqlite库——c语言实现匹配已知字符串中某个字段(该字段在其他表中),在其他表中获取值并显示

    问题描述: 1.部分sql语句:select id,name,grouname, poliname; 2.表名:user_resource:用户组表名:usergroup_name: 3.用户所在的用 ...

  7. 找字符串中最长单词C语言,C语言 在已知字符串中找最长单词

    编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词. 比如:"ni hao world",最长单词是5个字母 这个题目其实不难,但是很多初学者会没 ...

  8. 已知空间中的三点 求三角形面积_三角形的面积公式八叙

    本文将给出一些使用解析几何和向量表达的三角形面积公式.我们将三角形放置在二维平面坐标系中, 并设其三点坐标为 , , ,如下图所示: 我们采用构造已知图形面积的方法来求解未知图形面积的方法,所以我们在 ...

  9. 已知前序中序,求后序

    已知二叉树的前序和中序,求其后序 例:前序(A B D G H C E I F J ) 中序(G D H B A E I C J F) 其后序为:G H D B I E J F C A 思路:先序的遍 ...

最新文章

  1. 淘宝网7年变化图--建议非美工UED人员也看看
  2. JCIM | 用于自动生成类药分子的生成网络复合体(GNC)
  3. div+css实现表头固定内容滚动表格
  4. 基本算法个人PHP 实现(四)
  5. 算法导论-概率发生器
  6. tomcat安装与项目部署
  7. 如果用户的计算机在查询本地Net,网络操作系统管理2448-2
  8. 打破冷漠僵局文章_研究僵局–第2部分
  9. SWAT 学习相关基础知识(一)---Mr.Zhang
  10. paip.输入法编程---词库多意义条目分割 python实现.
  11. 用计算机考试时怎么返回桌面快捷键,win10系统如何使用返回桌面快捷键?快速返回到电脑桌面的方法...
  12. Visual Studio 安装 FLTK
  13. Linux Command grep
  14. “用户体验不是把每个环节做到极致,而是在关键环节打动用户“这句话对吗?...
  15. X在苍茫大地 闻一达(闻大嘴) 闻明远
  16. excel中按出生日期排序公式
  17. 二元置信椭圆r语言_R语言 第4章 初级绘图(6)
  18. 本地html文件显示不全,网页显示不全,详细教您网页显示不全怎么办
  19. java word 分页显示_jsp转word + 分页
  20. 讯飞输入法电脑版语音识别方法

热门文章

  1. ph获取xml文件信息
  2. Newtonsoft.Json code
  3. 60秒,我们可以干什么?
  4. 遇见你们,真好 ---致我的舍友
  5. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
  6. 2019年,比特币现金爱好者线下见面会发展至6大洲30个国家
  7. BCH粉必转 | 围绕BCH建立的相关项目和应用列表汇总
  8. Ajax基础知识梳理
  9. 【WPF】使用控件MediaElement播放视频
  10. [python]_ELVE_pip2和pip3如何共存