Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解JavaScript作用域和作用域链

理解JavaScript作用域和作用域链

原创
作者头像
用户10562852
发布于 2023-05-21 09:29:49
发布于 2023-05-21 09:29:49
45700
代码可运行
举报
文章被收录于专栏:前端不难前端不难
运行总次数: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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解变量对象、作用域链和闭包
执行上下文、执行栈、作用域链、闭包,这其实是一整套相关的东西,之前转载的文章也有讲到这些。下面两篇文章会更加详细地解释这些概念。
Chor
2019/11/07
7590
动图学 JavaScript 之:作用域链(Scope Chain)
上面调用了函数 getPersonInfo,然后返回了一个包含 name,age,city 的字符串:
savokiss
2019/12/31
5940
动图学 JavaScript 之:作用域链(Scope Chain)
深入理解作用域和闭包
JavaScript中的变量是松散类型的,没有规则定义它必须包含什么数据类型,它的值和数据类型在执行期间是可以改变的。
神奇的程序员
2022/04/10
5890
深入理解作用域和闭包
JavaScript执行机制:变量提升、作用域链、词法作用域、块级作用域、闭包和this
所以,JavaScript是ArkTS的基础,本文就来介绍一下JavaScript执行机制的一些核心概念。
陆业聪
2024/07/23
2160
JavaScript执行机制:变量提升、作用域链、词法作用域、块级作用域、闭包和this
深入理解JavaScript作用域
在上一篇文章 深入理解JavaScript 执行上下文 中提到 只有理解了执行上下文,才能更好地理解 JavaScript 语言本身,比如变量提升,作用域,闭包等,本篇文章就来说一下 JavaScript 的作用域。
木子星兮
2020/07/27
7470
深入理解JavaScript作用域
关于js作用域问题详解
在一段js代码拿过来真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。可用下图模拟:第一句报错,a未定义,很正常。第二句、第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道了a是undefined,但却不知道a是10(第三句中)。
IT人一直在路上
2019/09/18
2K0
关于js作用域问题详解
JavaScript作用域
JavaScript中的作用域是指变量、函数和对象在代码中可访问的范围。作用域规定了在何处以及如何查找变量和函数。理解作用域对于编写高质量的JavaScript代码至关重要。
堕落飞鸟
2023/05/17
2750
兄台: 作用域、执行上下文了解一下
变量的词法作用域(简称:作用域)是程序中可以访问变量的区域。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。
前端柒八九
2022/08/25
5400
兄台: 作用域、执行上下文了解一下
深入理解JS作用域链与执行上下文
这段代码,很意外地简单,我们的到了想要的结果,在控制台打印出了:Hello JavaScript hoisting 。
loveX001
2022/10/06
5230
JavaScript之执行环境与作用域的区别与联系​
如何一对花括号中的语句代码集都属于一个块,在这之中定义的所有变量在代码块外是不可见的,称为块级作用域。作用域控制着变量和参数的可见性与生命周期。
达达前端
2020/02/24
8460
前端入门18-JavaScript进阶之作用域链声明正文-作用域链
作为一个前端小白,入门跟着这几个来源学习,感谢作者的分享,在其基础上,通过自己的理解,梳理出的知识点,或许有遗漏,或许有些理解是错误的,如有发现,欢迎指点下。
请叫我大苏
2018/12/24
4590
深入理解Javacript从作用域作用域链开始
作用域是你的代码在运行时,某些特定部分中的变量,函数和对象的可访问性。换句话说,作用域决定了变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
coder_koala
2019/07/30
5530
深入理解Javacript从作用域作用域链开始
从 JavaScript 作用域说开去
在电脑程序设计中,作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。不同的编程语言可能有不同的作用域和名字解析。而同一语言内也可能存在多种作用域,随实体的类型变化而不同。作用域类别影响变量的绑定方式,根据语言使用静态作用域还是动态作用域变量的取值可能会有不同的结果。
一缕殇流化隐半边冰霜
2018/08/29
9160
从 JavaScript 作用域说开去
详解作用域链
在本文中,我们将着重讨论作用域链。首先我们会了解作用域、块级作用域、相关的一些重要概念等前置基础知识,接着我们会通过几个例子来对作用域链进行详细讲解,最后我们还会涉及作用域链延长的问题。在了解完上述知识之后,在本文主要内容的最后,我们还精选了网上几个作用域链相关的题目供小伙伴思考。
石璞东
2020/05/22
5950
java作用域-我是这样理解JavaScript中作用域
  学习任何一门编程语言,对于作用域的认知都是必要。因为作用域会影响标识符的定义以及生命周期。感觉没有说服力,太苍白了话不多说,接下来一起学习吧~
宜轩
2022/12/29
4310
作用域链和原型链的区别_原型链和作用域链
题外话:最近面试一直被问到作用域链的问题,所以还是要深入透彻的学习一下这两个概念。
全栈程序员站长
2022/11/16
5060
作用域链和原型链的区别_原型链和作用域链
执行上下文与作用域
函数每一次调用就会产生一个新的执行上线文环境,它被放在执行上下文栈。变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。执行上下文栈会在其所有代码执行完毕把执行上下文弹出,将控制权返回给执行上下文。ECMAScript代码执行流就是通过执行上下文栈进行控制。
用户10106350
2022/10/28
3170
JavaScript中的作用域和作用域链
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。可能这两句话并不好理解,我们先来看个例子:
刘亦枫
2020/03/19
2.4K0
JavaScript中的作用域和作用域链
JavaScript作用域及作用域链
作用域 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。 而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。
青梅煮码
2023/03/02
1.7K0
四、作用域与作用域链
作用域与作用域链本应该是一个非常简单的概念。可是在近两年多的留言中,我发现这些概念反而成为了大多数人想不明白的点,而感到困惑的原因在于,别的文章里,常常会提到词法作用域,词法分析等概念,到底是什么东西?好像跟我说的有一点不一样,但又不知道哪里不对?
用户6901603
2020/07/25
1.6K0
相关推荐
深入理解变量对象、作用域链和闭包
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验