Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解JavaScript作用域和作用域链

理解JavaScript作用域和作用域链

原创
作者头像
用户10562852
发布于 2023-05-21 09:29:49
发布于 2023-05-21 09:29:49
48400
代码可运行
举报
文章被收录于专栏:前端不难前端不难
运行总次数:0
代码可运行

​一、JavaScript中的作用域

作用域是当前的执行上下文,值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo() {
	var x = 'sfa'
}
console.log(x) //  x is not defined

全局作用域和函数作用域

全局作用域:在JavaScript中 {} 外面的作用域就是全局作用域,里面的变量和函数等其他资源可以在任意地方被访问到。一般来说以下几种情况拥有全局作用域

  • 最外层函数和在最外层函数外面定义的变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 该函数和该变量供全局使用,foo函数内部依旧能够使用foo函数(此处未演示)
var a = 23;
function foo() {
    var b = 1;
    function inner() { // 内部函数不能被全局使用
		return false
	}
}
console.log(a, foo) // 23 [Function: foo] 
console.log(b) // b is not defined
 // console.log(inner) // inner is not defined
  • 不使用var声明直接赋值的变量

因为JavaScript在执行是会自动隐式地创建该全局变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 相当于在全局:var b;
function foo() {
    b = 1;
}
foo()
console.log(b) // 1
  • 全局对象(globalThis)

全局对象可以通过globalThis获取,浏览器环境中指 Window

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(globalThis) // Node 环境中
Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  queueMicrotask: [Function: queueMicrotask],
  performance: Performance {
    nodeTiming: PerformanceNodeTiming {
      name: 'node',
      entryType: 'node',
      startTime: 0,
      duration: 43.25670003890991,
      nodeStart: 0.508400022983551,
      v8Start: 1.6218000054359436,
      bootstrapComplete: 33.73820000886917,
      environment: 12.502800047397614,
      loopStart: -1,
      loopExit: -1,
      idleTime: 0
    },
    timeOrigin: 1683861064321.689
  },
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  }
}

函数作用域:在函数内部定义的变量、函数和其他资源。在这个作用域内声明的变量,就只能在它这个作用域和其子作用域中才能使用。

块级作用域

ES6新增的块级作用域:用let和const声明的变量才存在块级作用域,在该代码块外部访问不到该变量。在{ }中用let和const声明的变量就是一个块级作用域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
	let a = 1;
	console.log(a) // 1
}
console.log(a) // a is not defined 外部访问不到

二、作用域链

作用域链指的是各个作用域的嵌套关系和查找机制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo() {
	var b = 'foo中的b'
    function bar() {
		// 当前作用域中没有声明b则查找上一级作用域(创建该作用域的那个域),依次类推,直至到全局作用域
		return b
	}
	return bar()
}

console.log(foo()) // foo中的b

上面代码中的b就是一个自由变量,即在当前作用域中没有定义b

三、js中的执行上下文

执行上下文(简称上下文)我们可以理解成一个js代码执行的环境,在代码执行阶段被创建,里面包含了定义的所有变量、函数以及this指向等。每个上下文都有一个关联的变量对象,保存着上面说的那些数据。虽然无法通过代码访问,但是后台处理数据会用到它。

全局上下文是最外层的上下文,表示全局上下文的对象可能不一样,在浏览器中就是 window 对象;上下文在其所有代码都执行完毕后会销毁(全局上下文在应用程序退出前被销毁)。

上下文中的代码在执行的时候会创建变量对象的一个作用域链(scope chain)。

希望本篇文章能够帮助到大家!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高手系列!数据科学家私藏pandas高阶用法大全 ⛵
如果你是数据科学家、数据分析师、机器学习工程师,或者任何 python 数据从业者,你一定会高频使用 pandas 这个工具库——它操作简单功能强大,可以很方便完成数据处理、数据分析、数据变换等过程,优雅且便捷。
ShowMeAI
2022/12/04
6.4K0
高手系列!数据科学家私藏pandas高阶用法大全 ⛵
懂Excel也能轻松入门Python数据分析包pandas(二):高级筛选(下)
经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas 。
Excel催化剂
2021/08/20
5310
懂Excel也能轻松入门Python数据分析包pandas(二):高级筛选(下)
pandas_VS_Excel提取各班前2名后2名的数据
pandas_VS_Excel提取各班前2名后2名的数据 【要求】 提取各班前2名的数据 提取各班后2名的数据 【代码】 # -*- coding: utf-8 -*- ''' 提取出了分组中的前2名:例如:提取出各班的总分的前2名 提取出分组的中的后2名:例如:提取出各班的总分的后2名 ''' import pandas as pd df=pd.read_excel('数据源(5个班各6人).xlsx') #这里先插入一个列'班名次'方便自己提取出数据后进行观察 df['班名次']=df['总分'].
哆哆Excel
2022/10/25
4120
pandas_VS_Excel提取各班前2名后2名的数据
"Python替代Excel Vba"系列(终):vba中调用Python
有小伙伴向我反映到,本系列前面的章节主要还是在讲 pandas ,几乎与 xlwings 没有啥关系。
咋咋
2021/09/01
6.1K0
"Python替代Excel Vba"系列(终):vba中调用Python
智能分析:ChatGPT+Excel+Python超强组合玩转数据分析
首先是顶流Python高举卷王之王的大旗向传统王者VBA抢班夺权,pandas, xlwings、OpenPyXL和Matplotlib等第三方包已经具备VBA和Power Query的几乎所有功能。
博文视点Broadview
2023/12/21
1.3K0
智能分析:ChatGPT+Excel+Python超强组合玩转数据分析
用 Pandas 进行数据处理系列 二
获取行操作df.loc[3:6]获取列操作df['rowname']取两列df[['a_name','bname']] ,里面需要是一个 list 不然会报错增加一列df['new']=list([...])对某一列除以他的最大值df['a']/df['a'].max()排序某一列df.sorted_values('a',inplace=True,ascending=True) , inplace 表示排序的时候是否生成一个新的 dataFrame , ascending=True 表示升序,默认为升序,如果存在缺失的补值( Nan ),排序的时候会将其排在末尾
zucchiniy
2019/10/30
8.5K0
Python替代Excel Vba"系列(四):课程表分析与动态可视化图表
前一节我们已经成功把一份教师课程表整理成规范的形式,本节我们就看一下怎么利用这份数据得到一些信息。并且尽可能让每个部分都有可视化输出。
咋咋
2021/09/01
1.9K0
Python替代Excel Vba"系列(四):课程表分析与动态可视化图表
"替代Excel Vba"系列(一):用Python的pandas快速汇总
以前学习 Python 的 pandas 包时,经常到一些 excel 的论坛寻找实战机会。接下来我会陆续把相关案例分享出来,还会把其中的技术要点做详细的讲解。
咋咋
2023/11/06
6230
"替代Excel Vba"系列(一):用Python的pandas快速汇总
盘点一个Python自动化办公实战问题——统计民主评议表格
前几天在Python最强王者交流群【东哥】问了一个Python自动化办公的问题。问题如下所示:大佬们,请教一个Python自动化办公问题,我有7个这样的民主评议表格,现在想通过Python批量的计算每个人最后的平均总分,应该怎么处理呢?
Python进阶者
2024/02/29
1610
盘点一个Python自动化办公实战问题——统计民主评议表格
Pandas三百题
pd.set_option('display.max_columns',None)
SingYi
2022/07/13
5.3K0
Pandas三百题
【数据处理包Pandas】分组及相关操作
数据集team.xlsx下载地址: 链接:https://pan.quark.cn/s/9e3b2a933510 提取码:7i2y
Francek Chen
2025/01/22
3970
【数据处理包Pandas】分组及相关操作
懂Excel就能轻松入门Python数据分析包pandas(四):任意分组成绩条
> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
咋咋
2021/09/01
7330
懂Excel就能轻松入门Python数据分析包pandas(四):任意分组成绩条
数据分析之Pandas分组操作总结
Pandas做分析数据,可以分为索引、分组、变形及合并四种操作。之前介绍过索引操作,现在接着对Pandas中的分组操作进行介绍:主要包含SAC含义、groupby函数、聚合、过滤和变换、apply函数。文章的最后,根据今天的知识介绍,给出了6个问题与2个练习,供大家学习实践。
Datawhale
2020/06/23
8.3K0
懂Excel就能轻松入门Python数据分析包pandas(四):任意分组成绩条
> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
Excel催化剂
2021/08/20
8820
懂Excel就能轻松入门Python数据分析包pandas(四):任意分组成绩条
50个超强的Pandas操作 !!
首先给出一个示例数据,是一些用户的账号信息,基于这些数据,这里给出最常用,最重要的50个案例。
JOYCE_Leo16
2024/03/22
1.2K0
Pandas50个高级操作,必读!
来源:机器学习杂货店 本文约4000字,建议阅读10分钟 在Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。 在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。 https://zhuanlan.zhihu.com/p/568250201 01、复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为
数据派THU
2023/04/18
1.6K0
Pandas50个高级操作,必读!
"Python替代Excel Vba"系列(三):pandas处理不规范数据
本系列前2篇已经稍微展示了 python 在数据处理方面的强大能力,这主要得益于 pandas 包的各种灵活处理方式。
咋咋
2021/09/01
5.5K0
"Python替代Excel Vba"系列(三):pandas处理不规范数据
零基础5天入门Python数据分析:第五课
在第一第二课已经讲了notebook的基础使用,python的基础语法及常用的数据结构及其运算,包括:
明月AI
2021/10/28
1.7K0
零基础5天入门Python数据分析:第五课
14个pandas神操作,手把手教你写代码
导读:Pandas是Python数据分析的利器,也是各种数据建模的标准工具。本文带大家入门Pandas,将介绍Python语言、Python数据生态和Pandas的一些基本功能。
Python进阶者
2021/07/27
3.8K0
14个pandas神操作,手把手教你写代码
vba新姿势,如何让vba的数据处理"超越"Python
上一节我们讨论了 Python 在数据处理上的优势,前后台大概收到的有用评论如下:
咋咋
2021/09/01
3.4K0
vba新姿势,如何让vba的数据处理"超越"Python
推荐阅读
相关推荐
高手系列!数据科学家私藏pandas高阶用法大全 ⛵
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验