深入理解JS的执行上下文、词法作用域和闭包(下)

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 四、总结 🎯
    • 执行上下文、词法作用域和闭包的关系
    • 理解这些概念对编程的重要性 💪
    • 实际应用中的注意事项和最佳实践 👀
  • 参考资料

四、总结 🎯

执行上下文、词法作用域和闭包的关系

在JavaScript中,执行上下文、词法作用域和闭包之间存在一些复杂的关系。下面详细解释这些关系:

执行上下文:

执行上下文是JavaScript中变量、函数和对象等执行时的上下文环境。JavaScript中,执行上下文主要包括全局执行上下文(Global Execution Context)和函数执行上下文(Functional Execution Context)。

全局执行上下文包含全局作用域中的变量、函数和对象等。函数执行上下文则包含函数词法作用域中的变量、函数和对象等。

当执行一段代码时,首先会创建全局执行上下文,将全局变量、函数和对象等放入其中。然后,按照代码中的函数调用顺序,依次创建函数执行上下文,并将函数词法作用域中的变量、函数和对象等放入其中。

词法作用域:

词法作用域是由代码文本中变量声明的位置决定的。在JavaScript中,词法作用域主要包括函数词法作用域和块级作用域。

函数词法作用域是指函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。块级作用域是指使用letconst声明的变量具有块级作用域,只能在声明它们的代码块(如for循环、if语句等)内部访问。

词法作用域主要影响变量的查找和函数的调用。当需要在某个作用域中查找变量或调用函数时,JavaScript会按照词法作用域的规则,从当前作用域开始,向上级作用域逐层查找,直到找到为止。

闭包:

闭包(Closure)是JavaScript中一种重要的概念,它指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。

闭包的主要特点包括函数可以记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。当一个函数在其词法作用域之外执行时,即使这个作用域在函数执行完毕后被销毁,该函数仍然可以访问其词法作用域中的变量。

总之,执行上下文、词法作用域和闭包之间的关系主要体现在以下几个方面:

  • 执行上下文是JavaScript中变量、函数和对象等执行时的上下文环境,词法作用域主要影响变量的查找和函数的调用。
  • 词法作用域是由代码文本中变量声明的位置决定的,闭包指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。
  • 闭包可以让函数记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。

实际项目中,可以根据具体需求和场景,灵活地使用执行上下文、词法作用域和闭包等概念。

理解这些概念对编程的重要性 💪

理解执行上下文、词法作用域和闭包对编程的重要性主要体现在以下几个方面:

提高代码的可读性和可维护性:理解这些概念有助于更好地理解JavaScript中的变量作用域和函数调用等问题,从而提高代码的可读性和可维护性。

例如,理解词法作用域可以让我们更好地理解以下代码:

function foo() {let a = 1;function bar() {console.log(a); // 输出 1}bar();
}foo();

在这个例子中,bar函数在其词法作用域foo之外执行,但仍然可以访问foo作用域中的变量a。理解词法作用域有助于我们更好地理解这个例子。

避免变量污染和冲突:理解执行上下文和词法作用域可以帮助我们更好地管理变量的作用域,避免全局作用域和函数作用域中的变量冲突。

例如,以下代码会导致全局作用域和函数作用域中的变量冲突:

let a = 1;function foo() {let a = 2;console.log(a); // 输出 2
}foo();
console.log(a); // 输出 2

在这个例子中,全局作用域和函数作用域中的变量a冲突,导致输出结果不符合预期。理解执行上下文和词法作用域有助于我们避免这种错误。

实现模块化和封装:闭包可以让函数记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。这使得我们可以将一组相关的函数和变量封装在一个函数内部,然后返回这个函数的引用,这样就可以在其他地方调用这些函数并访问它们需要的变量。

例如,使用闭包实现一个简单的模块:

function createCart() {let products = [];function addProduct(product) {products.push(product);}function getProducts() {return products;}return {addProduct,getProducts};
}const cart = createCart();
cart.addProduct({ id: 1, name: 'Product 1' });
console.log(cart.getProducts()); // 输出:[{ id: 1, name: 'Product 1' }]

在这个例子中,createCart函数返回一个闭包,包含addProductgetProducts函数以及它们需要的变量products。这样可以实现模块化,将一组相关的函数和变量封装在一个函数内部。

总之,理解执行上下文、词法作用域和闭包对编程的重要性主要体现在提高代码的可读性和可维护性、避免变量污染和冲突以及实现模块化和封装等方面。实际项目中,可以根据具体需求和场景,灵活地使用这些概念。

实际应用中的注意事项和最佳实践 👀

在实际应用中,关于执行上下文、词法作用域和闭包,有一些注意事项和最佳实践:

使用letconst声明变量:在声明变量时,建议使用letconst而不是varletconst声明的变量具有块级作用域,可以在声明它们的代码块(如for循环、if语句等)内部访问,而var声明的变量具有函数作用域,可以在整个函数内部访问。

例如,以下代码使用let声明变量:

function foo() {let a = 1;function bar() {console.log(a); // 输出 1}bar();
}foo();

而以下代码使用var声明变量:

function foo() {var a = 1;function bar() {console.log(a); // 输出 1}bar();
}foo();

使用函数执行上下文:在实际项目中,可以使用函数执行上下文来封装一组相关的函数和变量,这样可以实现模块化和封装。

例如,以下代码使用函数执行上下文:

function createCart() {let products = [];function addProduct(product) {products.push(product);}function getProducts() {return products;}return {addProduct,getProducts};
}const cart = createCart();
cart.addProduct({ id: 1, name: 'Product 1' });
console.log(cart.getProducts()); // 输出:[{ id: 1, name: 'Product 1' }]

避免全局作用域污染:在实际项目中,避免全局作用域污染非常重要。全局作用域中的变量和函数可能会影响到其他代码,导致难以维护和调试。可以使用闭包来避免全局作用域污染。

例如,以下代码使用闭包避免全局作用域污染:

function createCounter() {let count = 0;return function() {count += 1;console.log(count); // 输出 1 2 3};
}const counter = createCounter();
counter();
counter();
counter();

总之,在实际应用中,关于执行上下文、词法作用域和闭包,需要注意使用letconst声明变量,使用函数执行上下文封装相关函数和变量,以及避免全局作用域污染。这些注意事项和最佳实践有助于提高代码的可读性和可维护性,降低代码的耦合度,使代码更加清晰和易于维护。

参考资料

[1]《JavaScript 高级程序设计》
[2] MDN Web Docs: JavaScript

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/488462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块:在系统首页可以查看首页、…

宝塔面板-安装与卸载

宝塔面板(BT Panel)是一款在互联网上广泛使用的服务器管理软件,它以其简洁的界面和强大的功能受到了许多站长的喜爱。通过宝塔面板,用户可以轻松地管理服务器上的网站、数据库、FTP、邮箱等服务。本文将详细介绍宝塔面板的安装与卸…

音视频开发之旅(68)-SD文生图

目录 效果展示 sd使用流程:选大模型、写关键词和设置参数 SDWebui文生图调用流程 StableDiffusion原理浅析 参考资料 一、效果显示 1girl,smile,highres,wallpaper,in summer,landscape 1girl,smile,highres,wallpaper,in summer,city,street 二、sd使用流程&a…

QT 打包命令 windeployqt 在windows平台应用

本文以qt6.2.4 MSVC2019 为例,描述打包过程。 前置条件:已经生成了可执行文件,比如xxx.exe 1.在搜索框输入QT,点击QT6.2.4(MSVC 2019 64-bit) 以你实际安装的版本为准。 2.出现如下黑屏命令行 3.在QT 项目文件下新建一个打包文件夹&#x…

Linux之ACL访问控制列表

一、ACL权限的介绍 1.1 什么是ACL 访问控制列表(ACL)是一种网络安全技术,它通过在网络设备(如路由器、交换机和防火墙)上定义一系列规则,对进出接口的数据包进行控制。这些规则可以包含“允许”&…

跨区互联组网怎么做?SD-WAN专线可以实现吗?

在当今数字化时代,企业不断扩张,跨区域互联成为业务发展的必然需求。然而,跨区互联组网涉及到复杂的网络架构和连接,传统的网络方案往往难以满足高性能、高可靠性和低成本的要求。SD-WAN专线技术的出现,为跨区互联组网…

如何不患心肌梗塞

目录 一,个人面板 二,公共版图 三,卡牌 1,食物牌 2,药物牌 3,事件牌 四,回合操作 1,起始玩家 2,一轮操作 3,个人回合 4,轮末结算 5&a…

excel标记文本中的关键词加红加粗

任务: 有这么一张表,关键词为 word,文本内容为 text,现在想把 text 中的 word 标红加粗,如果数据量少,文本段手动标还可以,多起来就不太方便了 代码: import pandas as pd import x…

如何食用Kaggle的Course中的exercise?

前言 读完本文只需要几分钟,读完后你将知道: 如何连接kaggle的反馈系统如何检查代码正确性如何查看提示如何查看答案。 关于Setup 通常最上面的会有一块代码,它的功能是连接kaggle的反馈系统,这样才能执行能够提供反馈的代码。…

探究全链路压力测试的含义与重要性

全链路压力测试是指对整个应用系统的各个环节或组件进行压力测试,以模拟实际生产环境中的用户负载和流量,评估系统在高负载条件下的性能表现。 1. 全链路压力测试的含义 全链路压力测试涉及系统的所有组件和环节,包括前端用户界面、应用服务器…

VsCode的leetcode插件无法登录

前提 想使用VsCode的leetcode插件进行刷题,然后按照网上的教程进行安装下载,但是到了登录这一步,死活也登录不了,然后查看log一直报的错误是invalid password。 解决方法 首先确定在插件中设置的站点是Leetcode中国&#xff0c…

紫光同创初使用

芯片PGC2KG-6LPG144 1、安装好软件接,加载license,有两个,与电脑MAC地址绑定的 2、正常使用后,新建个工程,配置管脚Tools→UCE 3、程序中有些信号被软件认为是时钟信号,会报错(时钟输入I0约束在非专用时钟…