Js面试之作用域与闭包
Js面试之作用域与闭包
- 作用域
- 词法作用域
- 动态作用域
- 闭包
- 闭包使用场景
- 封装私有变量
- 模块化开发
- 保持变量状态
- 异步操作
- 注意事项
最近在整理一些前端面试中经常被问到的问题,分为vue相关、react相关、js相关、react相关等等专题,可持续关注后续内容,会不断进行整理~
作用域
作用域(scope)定义了程序中变量的可访问性和生命周期,在js中,作用域有两种主要的类型:词法作用域(Lexical Scope)和动态作用域(Dynamic Scope);
词法作用域
词法作用域又称静态作用域,是指作用域在代码编写阶段就确定的,与函数的定义位置有关。javascript使用词法作用域,函数的作用域在函数定义时就已经确定
var globalVariable = 'I am global'function outer() {var outerVariabl = 'I am outer'function inner() {var innerVariable = 'I am inner'console.log(innerVariable) // 可以访问innerVariableconsole.log(outerVariable) // 可以访问outerVariableconsole.log(globalVariable) // 可以访问globalVariable}inner();console.log(innerVariable) // Error: innerVariable is not defined
}outer()
动态作用域
动态作用域是在运行时根据调用链来确定的,与函数的调用位置有关。js不使用动态作用域,而是使用词法作用域
闭包
闭包(Closure)是指一个函数和其词法作用域的组合。当函数在词法作用域以外的地方被调用时,它仍然能够访问自己的词法作用域,形成了闭包。
或说
闭包(Closure)是指有权访问另一个函数作用域中变量的函数,即便是在外部函数执行完毕之后。
function outer() {var outerVariable = 'I am outer'function inner() {console.log(outerVariable) // 形成闭包,可以访问outerVariable}return inner
}var closureFunction = outer()
closureFunction() // 通过闭包访问outerVariable
闭包使用场景
封装私有变量
通过闭包,可以创建私有变量,只能通过闭包内部的函数访问,不会被外部直接访问到;
function counter() {var count = 0;return function() {count++;console.log(count);};
}var increment = counter();
increment(); // 输出 1
increment(); // 输出 2
模块化开发
使用闭包可以创建模块,将相关的功能封装到一个闭包中,避免全局污染
var module = (function() {var privateVariable = 'I am private';function privateFunction() {console.log('This is private')}return {publicVariable: 'I am public',publicFunction: function() {console.log('This is public')}}
})()console.log(module.publicVariable) // I am public
module.publicFunction() // This is public
保持变量状态
由于闭包可以访问外部函数的变量,所以可以保持状态
function createCounter() {var count = 0;return {increment: function() {count++;console.log(count)},reset: function() {count = 0;console.log('Count reset')}}
}var counter = createCounter();
counter.increment(); // 输出1
counter.increment(); // 输出2
异步操作
在异步回调中经常使用闭包来保存状态
function fetchData(url, callback) {var data = null;fetchDataFromServer(url, function(result)) {// 调用 fetchDataFromServer 函数从服务器异步获取数据,并传给datadata = result;callback();});return function() {// 使用闭包中的dataconsole.log(data);}
}var getData = fetchData('https://example.com/data', function() {console.log('Data received');
})// 在合适的时机调用getData()
注意事项
- 潜在的内存泄漏问题:如果闭包中引用了大量变量,可能导致内存无法释放。
- 滥用闭包可能导致性能问题,因为它们会占用更多内存
相关文章:
Js面试之作用域与闭包
Js面试之作用域与闭包 作用域词法作用域动态作用域 闭包闭包使用场景封装私有变量模块化开发保持变量状态异步操作 注意事项 最近在整理一些前端面试中经常被问到的问题,分为vue相关、react相关、js相关、react相关等等专题,可持续关注后续内容ÿ…...
Go 爬虫之 colly 从入门到不放弃指南
文章目录 概要介绍如何学习官方文档如何安装快速开始如何配置调试分布式代理层面执行层面存储层面存储多收集器配置优化持久化存储启用异步加快任务执行禁止或限制 KeepAlive 连接扩展总结如果想用 GO 实现爬虫能力,该如何做呢?抽时间研究了 Go 的一款爬虫框架 colly。 概要…...
Ceph分布式存储(1)
目录 一.ceph分布式存储 Ceph架构(自上往下) OSD的存储引擎: Ceph的存储过程: 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘,一个网卡: 10节点为admin,20-40为node&…...
制造业工厂为什么要实施MES系统呢?
MES是生产管理系统,生产管理是通过对生产系统的战略计划、组织、指挥、实施、协调、控制等活动,实现系统的物质变换、产品生产、价值提升的过程。在企业的价值链中,生产经营是企业核心能力的重要组成部分。 实施MES系统的原因 MES系统是中国比…...
Python 一行命令部署http、ftp服务
Python 一行命令部署http服务 文章目录 Python 一行命令部署http服务具体操作命令如下浏览器返回下载Python 一行命令部署FTP服务 具体操作命令如下 这个比nginx相对来说更加简单,可以用于部署特殊场景时如银行等部署时,各种权限控制,内网之间…...
DBA技术栈(三):MySQL 性能影响因素
文章目录 前言一、影响MySQL性能的因素1.1 商业上的需求1.2 应用架构规划1.3 查询语句使用方式1.4 Schema的设计1.5 硬件环境 总结 前言 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数…...
SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动
目录 一、问题 二、原因 1、修改配置 2、添加Lazy注解在client上面 3、启动成功 一、问题 当在gateway的全局过滤器GlobalFilter中注入OpenFeign接口的时候会一直卡在路由中,但是不会进一步,导致启动未成功也未报错失败 2024-01-18 22:06:59.299 I…...
web前端项目-贪吃蛇小游戏【附源码】
web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏,采用HTML、CSS和JavaScript技术进行开发,玩家通过控制一条蛇在地图上移动,蛇的目的是吃掉地图上的食物,并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&am…...
ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练
论文标题:Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码:https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势,因为模态之间有充分的相互…...
代码随想录 Leetcode459. 重复的子字符串(KMP算法)
题目: 代码(首刷看解析 KMP算法 2024年1月18日): class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…...
Rust之构建命令行程序(三):重构改进模块化和错误处理
开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序,我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先,我们的main函数现在执行两项任务:解析参数和…...
广和通AI解决方案“智”赋室外机器人迈向新天地!
大模型趋势下,行业机器人将具备更完善的交互与自主能力,逐步迈向AI 2.0时代,成为人工智能技术全面爆发的重要基础。随着行业智能化,更多机器人应用将从“室内”走向“室外”,承担更多高风险、高智能工作。复杂的室外环…...
C++I/O流——(4)格式化输入/输出(第二节)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 含泪播种的人一定能含笑收获ÿ…...
九、K8S-label和label Selector
label和label selector 标签和标签选择器 1、label 标签: 一个label就是一个key/value对 label 特性: label可以被附加到各种资源对象上一个资源对象可以定义任意数量的label同一个label可以被添加到任意数量的资源上 2、label selector 标签选择器 L…...
【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解 文章目录 【.NET Core】 多线程之(Thread)详解一、概述二、线程的创建和使用2.1 ThreadStart用于无返回值,无参数的方法2.2 ParameterizedThreadStart:用于带参数的方法 三、线程的…...
苹果笔记本 macbook 在 office word 中使用 mathtype 的方法
前言 想在 MacBook 中使用 mathtype,去搜索,去 Apple Store 下载也发现没有 解决方法 打开 office Word 的「插入」中的「获取加载项」、「我的加载项」。 在应用商店中下载,需要登录自己的微软账号。 加载成功后就可以使用了。 注意 和…...
课表排课小程序怎么制作?多少钱?
在当今的数字化时代,无论是购物、支付、点餐,还是工作、学习,都离不开各种各样的微信小程序。其中,课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢?又需要多少钱呢? …...
C语言总结十三:程序环境和预处理详细总结
了解程序的运行环境可以让我们更加清楚的程序的底层运行的每一个步骤和过程,做到心中有数,预处理阶段是在预编译阶段完成,掌握常用的预处理命令语法,可以让我们正确的使用预处理命令,从而提高代码的开发能力和阅读别人…...
tinyxml2
使用tinyxml2,得知道一些xml基础 xml tutorial--菜鸟 tinyxml2类对象 链接 结构 XMLNode 什么是节点 节点:元素、声明、文本、注释等。 XMLDocument xml文档(文件)对象。 作用: 加载xml文件, tinyxml2作用 先定义两个宏 …...
What is `@Controller` does?
Controller 是SpringMVC注解,标记一个类作为Web控制器(Controller),负责处理HTTP请求并返回响应结果 在SpringMVC中,控制器类的主要职责是: 1、接收来自客户端的HTTP请求 2、调用服务层或其他业务逻辑组件…...
ai结对编程:让kimi等模型在快马平台帮你智能构建黑马点评
最近在做一个类似大众点评的项目"黑马点评",尝试用AI辅助开发的方式来完成。整个过程在InsCode(快马)平台上完成,体验非常流畅。这里记录下我的开发过程,希望能给同样想尝试AI结对编程的朋友一些参考。 数据库设计阶段 首先需要设…...
如何快速掌握Pelican静态网站生成器:Full Stack Python的技术架构解析
如何快速掌握Pelican静态网站生成器:Full Stack Python的技术架构解析 【免费下载链接】fullstackpython.com Full Stack Python source with Pelican, Bootstrap and Markdown. 项目地址: https://gitcode.com/gh_mirrors/fu/fullstackpython.com 想要快速构…...
nli-distilroberta-base实操手册:生产环境Nginx反向代理+HTTPS配置指南
nli-distilroberta-base实操手册:生产环境Nginx反向代理HTTPS配置指南 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa-base模型90%的性…...
实战应用:基于快马平台开发类似ahflt.sys的文件操作监控工具
实战应用:基于快马平台开发类似ahflt.sys的文件操作监控工具 最近在研究Windows内核驱动开发时,发现ahflt.sys这类文件系统过滤驱动特别有意思。它能够在系统底层监控文件操作,实现各种高级功能。作为一个开发者,我决定在InsCode…...
OmenSuperHub深度解析:惠普游戏本硬件控制的纯净解决方案
OmenSuperHub深度解析:惠普游戏本硬件控制的纯净解决方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 对于追求极致性能与系统纯净度的惠普…...
基于SpringBoot的旅游网站管理系统
源码获取地址: 链接: https://pan.baidu.com/s/1Swe7JUSV7rRuBkagxRgL6g?pwdaufn提取码: aufn(文件先保存到自己网盘,谨防文件丢失!!) 该网站是一个旅游管理系统,旨在为用户提供便捷的旅游信息…...
HTML函数在高负载下自动关机是硬件问题吗_过热保护机制【汇总】
HTML没有函数,更不会导致关机;所谓“HTML函数关机”是误解,实际是高负载JS/渲染引发CPU/GPU过热,触发系统级温控断电。HTML 函数在高负载下自动关机?压根不存在这个函数HTML 是标记语言,没有“函数”&#…...
避开高速接口时序坑:用IDELAY2和ODDR实战优化FPGA的input delay约束
高速接口时序优化实战:IDELAY2与ODDR的精细控制艺术 当FPGA设计遭遇GHz级高速接口时,传统的时序约束方法往往捉襟见肘。我曾在一个25Gbps背板项目中发现,即使精确计算了input delay约束,时序报告仍显示关键路径存在0.3ns的违例—…...
提升编码效率:用快马平台调用codex自动生成常用工具函数库
提升编码效率:用快马平台调用codex自动生成常用工具函数库 最近在开发一个前端项目时,发现每次都要重复写一些基础工具函数,比如日期格式化、对象深拷贝这些。虽然网上能找到现成的代码,但质量参差不齐,整合起来也很费…...
SMUDebugTool终极指南:轻松解锁AMD Ryzen处理器的隐藏性能
SMUDebugTool终极指南:轻松解锁AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...
