JS核心知识-作用域和作用域链

在大多数语言都对变量访问进行限制,例如Java、C。JavaScript也有这样的设计。这样的规则称为作用域。按照指定规则查找变量的路径称为作用域链

作用域

作用域本质是一套规则,它定义了在什么地方以及查找变量。可以比作盒子,盒子里面有什么东西(变量和函数),哪些人可以看到使用这东西(变量和函数的访问权限)。

作用域主要分为以下几种:

  • 全局作用域:脚本运行时顶级作用域,它始终在调用栈的栈底
  • 函数作用域:在函数创建的作用域
  • 块级作用域:通过letconst声明的变量,被限制在{}之内可以访问。ES6引入特性
  • 模块作用域:模块模式下运行代码的作用域。通过<script type="module">或者.mjs文件定义的脚本内部具有模块作用域
js 复制代码
// 全局作用域
var globalValue = 'global value';
funciton executeFunction() {
    // 函数作用域
    var executeValue = 'execute value';
    if (true) {
        // 块级作用域
        let blockValue = 'bloack value';
    }
    // 此处访问blockValue 报错
}
// 此处访问executeValue 报错

作用域链

作用域链是当前执行上下文和所有外层执行上下文以链表数据结果关联起来的一条链条。这是当前执行上下查找变量的核心。

js 复制代码
var globalValue = "global value";
function executeFunction() {
  var executeValue = "execute value";
  function innerFunction() {
    var innerValue = "inner value";
    console.log(innerValue);
    console.log(executeValue);
    console.log(globalValue);
  }
  return innerFunction;
}

var execute = executeFunction();
execute();

在上述代码中的作用域链就像下面图的结构

作用域和作用域链与执行上下文之间关系

作用域定义了一套变量访问权限规则;执行上下文时按照这个规则下的具体实现。而作用域链是这套规则在代码运行时具体实现,列出了所有需要查找的变量对象。

特性 作用域 执行上下文
定义 词法、静态、在编写代码已经决定 运行时、动态
确定时机 函数定义时确定 函数调用时创建
数量关系 这是一套规则 一个环境,包含了代码运行时所有需要的信息
比喻 房子的蓝图 正在使用房间

小结

本章主要讲解作用域和作用域链,以及作用域和作用域链与执行上下文的关系。下章将会讲讲this确定指向的时机,this在不同情况下到底指向谁? 下章见👋🏻👋🏻┏(^0^)┛。

相关推荐
前端大卫33 分钟前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友34 分钟前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理2 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻2 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front3 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰3 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼985 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮5 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20025 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员
excel5 小时前
🧩 深入浅出讲解:analyzeScriptBindings —— Vue 如何分析 <script> 里的变量绑定
前端