2024年前端面试中JavaScript的30个高频面试题之中级知识
基础知识
高级知识
13. 什么是闭包?闭包的用例有哪些?
闭包是一个功能,它允许函数捕获定义该函数的环境(或保留对作用域中变量的访问)即使在该作用域已经关闭后。
我们可以说闭包是函数和词法环境的组合,其中定义了该函数。
换句话说,闭包为函数提供了访问自己的作用域、外部函数的作用域和全局作用域的能力,允许它“记住”并继续访问这些作用域中的变量和参数。
function outerFunction() {let outerVariable = 'I am from the outer function';return innerFunction() {console.log(outerVariable); // 访问外部函数作用域中的outerVariable}}let myFunction = outerFunction();
myFunction(); // 输出:I am from the outer function
每次在函数创建时以及在另一个函数内部定义函数时都会创建闭包。
执行上下文是一个执行JavaScript代码的环境。 对于每个函数调用,都会创建一个单独的执行上下文并推送到执行堆栈中。 一旦函数执行完成,它就会从堆栈中弹出。
每个执行上下文都有一个内存空间,其中存储了其变量和函数,一旦从执行堆栈中弹出函数,JavaScript垃圾收集器就会清除所有这些内容。
在JavaScript中,只有当没有引用某个对象时,该对象才会被垃圾回收。
在上面的示例中,匿名执行上下文仍对其外部环境的内存空间中的变量有引用。 即使outerFunction()已完成(它可以访问 outerVariable 变量并在console.log(outerVariable)中使用它)。
JavaScript中的闭包有几个重要用例:
-
数据隐私和封装:闭包可用于创建私有数据和封装有限范围内的功能。 通过在另一个函数内定义函数,内部函数可以访问外部函数的变量,但这些变量对外部函数不可访问。 这允许创建对外不直接可访问的私有数据和方法,从而增强了数据隐私和封装。
-
状态维护:闭包通常用于在异步操作和事件处理中维护状态。 例如,在处理异步任务时,闭包可以捕获和保留跨多个异步操作的变量状态,确保在异步任务完成时可以访问到正确的变量。
-
柯里化和偏函数应用:闭包有助于函数式编程技术如柯里化和偏函数应用。 通过使用闭包捕获和记住特定参数并返回使用这些捕获参数的新函数,可以实现柯里化和偏函数应用。 这允许创建具有预设参数的特化函数,提供灵活性和可重用性。
-
模块模式:闭包在实现JavaScript中的模块模式中至关重要。 通过使用闭包创建私有变量并只公开必要的公共方法,开发人员可以创建模块化和组织良好的代码,防止对内部模块数据的不必要访问和修改。
-
回调函数:在使用回调函数时,经常使用闭包。 闭包可用于在异步操作的上下文中捕获和维护变量的状态,以确保在调用回调函数时可以访问到正确的变量。
14. 解释JavaScript中的变量提升概念。
JavaScript中的变量提升是变量和函数声明自动移至其包含作用域顶部的默认行为。 这发生在编译阶段,在实际代码执行之前。 这意味着您可以在代码中声明之前使用变量或调用函数。
使用 var声明变量时,声明会被提升到包含函数或块的顶部,并使用默认值“undefined”初始化。
console.log(x); // 输出:undefined
var x = 5;
使用 let 和 const 声明的变量也会被提升,但是它们有一个“暂时性死区”,在该区域中不能在声明之前被访问。
console.log(x); // 抛出错误(ReferenceError)
let x = 5;
函数声明也会被提升到其包含作用域的顶部。您可以在代码中声明之前调用函数。
sayHello(); // 输出:Hello, world!
function sayHello() {console.log("Hello, world!");
}
箭头函数、函数表达式或变量初始化不会被提升。
15. 什么是暂时性死区?
暂时性死区(TDZ)是与使用 let 和 const 声明变量相关的 JavaScript 概念。
当您使用 let 或 const 声明一个变量时,它会被提升到其包含作用域的顶部,但是与 var 不同,使用 let 和 const 声明的变量在 TDZ 中保持未初始化状态。
在作用域内实际声明变量之前尝试访问或使用该变量会导致 ReferenceError。这可防止在变量被适当定义之前使用它。
了解暂时性死区很重要,因为它有助于防止变量在初始化之前使用导致的相关错误。它还通过鼓励在使用之前适当声明变量来推广JavaScript编码的最佳实践。
16. 什么是原型链? 以及 Object.create() 方法?
在 JavaScript 中,每个函数和对象默认都有一个名为 prototype 的属性。
JavaScript中的每个对象都有一个原型。 原型是当前对象继承属性和方法的另一个对象。 您可以将原型视为模板或父对象。
原型链是允许对象从其他对象继承属性和方法的机制
在对象上访问某个属性或方法时,JavaScript会首先在对象本身上查找它。 如果找不到,它会在原型链上向上查找,直到找到该属性或方法。 此过程会一直持续到到达链顶部的 Object.prototype 为止。
17. Call、Apply和Bind方法的区别是什么?
Call: call()方法使用指定的this值调用函数,并以逗号分隔的值的形式传入单独的参数
const person1 = { name: 'John' };
const person2 = { name: 'Jane' };function greet(greeting) {console.log(greeting + ' ' + this.name);
}greet.call(person1, 'Hello'); // 输出:Hello John
greet.call(person2, 'Hi'); // 输出:Hi Jane
使用 call() 方法,一个对象可以调用另一个对象所拥有的方法。
const o1 = {name: 'ravi',getName: function(){ console.log(`Hello, ${this.name}`)}
}const o2 = {name: 'JavaScript Centric'
}o1.getName.call(o2) // Hello, JavaScript Centric
Apply: 使用给定的 this 值调用函数,但是它使用数组的形式接受参数。 当参数的数量未知或者参数已在数组中时,Apply非常有用。
const numbers = [1, 2, 3, 4, 5]; const max = Math.max.apply(null, numbers);
console.log(max); // 输出:5
Bind: 与调用它不同,bind() 会返回一个新函数,并允许您传入任意数量的参数。bind() 方法接受一个对象作为第一个参数,并创建一个新函数。
const module = {x: 42,getX: function() {return this.x; }
}; const boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // 输出:42
18. 什么是lambda或箭头函数?
JavaScript中有两种类型的函数:
- 常规函数
- 箭头函数(在 ES6 中引入)
常规函数: 我们可以通过两种方式编写常规函数,即函数声明和函数表达式。
箭头函数或胖箭头函数:也称为 lambda 函数,是在 JavaScript(ES6)中引入的一种更简洁的函数表达式语法。 与传统的函数表达式相比,它们具有较短的语法,在创建匿名函数和使用函数式编程概念方面特别有用。
这里没有声明方法,我们只能通过函数表达式来编写。

箭头函数和常规函数之间有一些区别:
- 语法
- 没有参数 (参数是类数组对象)
- 箭头函数没有原型对象
- 不能用 new 关键字调用 (不是构造函数)
- 没有自己的 this (call、apply 和 bind 不会按预期工作)
- 它不能用作生成器函数
- 不允许重复命名的参数
19. 什么是柯里化函数?
柯里化是函数式编程中的一种技术,它将接受多个参数的函数转换成一系列每个接收单个参数的函数。 通过组合这些柯里化的函数,可以构建更复杂的函数。
在 JavaScript 中,您可以使用闭包和返回函数来实现柯里化。
// 接收两个参数的常规函数
function add(x, y) {return x + y;
}
// 函数的柯里化版本
function curryAdd(x) {return function(y) {return x + y;};
}const add5 = curryAdd(5); // 偏函数应用,创建新函数
console.log(add5(3)); // 输出:8
柯里化在函数式编程中很有用,它可以使代码更模块化和可重用。 当您想要使用变参函数或者构建数据转换流水线时,它特别有用。
20. ES6的特性有哪些?
ES6,也称为 ECMAScript 2015,为 JavaScript 引入了许多新特性和增强功能,极大地扩展了该语言的功能。 ES6的一些关键特性包括:
- 箭头函数
- 块作用域变量
- 类
- 模块
- 模板字面量: 模板字面量允许使用反引号嵌入表达式和多行字符串,这提供了在 JavaScript 中创建复杂字符串的更方便的方法。
- 默认参数
- Rest和Spread运算符
- 解构赋值
- Promise
- Map、Set、WeakMap、WeakSet: ES6 引入了新的内置数据结构,如 Map 和 Set,可以更高效和专门地处理集合和键值对。
- 迭代器和生成器
- 增强的对象字面量
相关文章:
2024年前端面试中JavaScript的30个高频面试题之中级知识
基础知识 高级知识 13. 什么是闭包?闭包的用例有哪些? 闭包是一个功能,它允许函数捕获定义该函数的环境(或保留对作用域中变量的访问)即使在该作用域已经关闭后。 我们可以说闭包是函数和词法环境的组合,其中定义了该函数。 换句话说,闭包为函数提供了访问自己的作用域、…...
postman 简单测试(一)
1.postman官网 Postman API Platform 2.研究了一下postman 一些简单的功能,自己做个记录,同时希望能节约点测试时间。 2.1新建一个 collections 长期测的话,最好注册一个账号,开放更多功能。 2.2新建一个请求 后端要先搭建起来…...
12.1、2、3-同步状态机的结构以及Mealy和Moore状态机的区别
同步状态机的结构以及Mealy和Moore状态机的区别 1,介绍Mealy型状态机和Moore型状态机的两种结构2,设计高速电路的方法 由于寄存器传输级(RTL)描述的是以时序逻辑抽象所得到的有限状态机为依据,因此,把一个时…...
前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包
目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏…...
SpringBoot源码启动流程(待完善)
SpringBoot源码启动流程 1. 构造SpringApplication对象 1.1 推测web应用类型 判断关键类是否存在来区分类型 REACTIVENONESERVLET static WebApplicationType deduceFromClasspath() {if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isP…...
存内计算技术打破常规算力局限性
目录 前言 关于存内计算 1、常规算力局限性 2、存内计算诞生记 3、存内计算核心 存内计算芯片研发历程及商业化 1、存内计算芯片研发历程 2、存内计算先驱出道 3、存内计算商业化落地 基于知存科技存内计算开发板ZT1的降噪验证 (一)任务目标以…...
uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现
锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...
RabbitMQ入门到实战——高级篇
消息的可靠性 生产者的可靠性(确保消息一定到达MQ) 生产者重连 这⾥除了enabled是false外,其他 initial-interval 等默认都是⼀样的值。 生产者确认 生产者确认代码实现 application中增加配置:(publisher-returns…...
05.阿里Java开发手册——前后端规约
【强制】前后端交互的 API,需要明确协议、域名、路径、请求方法、请求内容、状态码、响 应体。 说明: 协议:生产环境必须使用 HTTPS。路径:每一个 API 需对应一个路径,表示 API 具体的请求地址: aÿ…...
Linux网络服务部署yum仓库
目录 一、网络文件 1.1.存储类型 1.2.FTP 文件传输协议 1.3.传输模式 二、内网搭建yum仓库 一、网络文件 1.1.存储类型 直连式存储:Direct-Attached Storage,简称DAS 存储区域网络:Storage Area Network,简称SAN࿰…...
智慧工地AI识别安全预警解决方案---豌豆云
实现在工地内所有视频覆盖区域对工人未穿工作服的24小时AI识别监测,发现人员未穿工作服及时报警至平台; 实现在工地内重点关注区域的AI人员统计; 实现在工地内监控覆盖区域的烟雾、火源24小时AI识别检测,发现烟雾、火源时及时报警,并通知相关负责人采取…...
红队打靶练习:TOMMY BOY: 1
目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB robots.txt get flag1 get flag2 FTP登录 文件下载 更改代理 ffuf爆破 get flag3 crunch密码生成 wpscan 1、密码爆破 2、登录wordpress ssh登录 get flag4 信息收集 get flag5 信息收集 1、arp …...
Springboot中的@DependsOn注解
在我的最近的Spring Boot项目中,我遇到了涉及两个Bean的情况,Bean1和Bean2。在初始化过程中,我需要Bean2依赖于Bean1。 其中Spring中的 DependsOn 注解,允许我指定在创建Bean2之前,Spring应确保Bean1已初始化。 Depen…...
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
专栏系列:Django学习教程 前言 highchart,国外。 echarts,国内。 本项目集成 hightchart和echarts图表库实现数据统计功能。 包括:折线图,柱状图,饼图和数据集图。 效果图 echats Highcharts 源代码…...
【机器学习 西瓜书】期末复习笔记整理
一些杂点: 测试集如何归一化? —— 不是用测试集的均值和标准差,而是用训练集的! 机器学习: 对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。 参考计算例题: 机器学习【期末复习…...
回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测
回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-GRU蛇群算法优化门控循环单元的数…...
自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答
大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答。T5模型和BERT模型是两种常用的自然语言处理模型。T5是一种序列到序列模型,可以处理各种NLP任务,而BERT主要用于预训练语言表示。T5使用了类似于BERT的预训…...
分布式搜索——Elasticsearch
Elasticsearch 文章目录 Elasticsearch简介ELK技术栈Elasticsearch和Lucene 倒排索引正向索引倒排索引正向和倒排 ES概念文档和字段索引和映射Mysql与Elasticsearch 安装ES、Kibana安装单点ES创建网络拉取镜像运行 部署kibana拉取镜像部署 安装Ik插件扩展词词典停用词词典 索引…...
用python实现调用nosql
要使用Python调用NoSQL数据库,您需要使用适当的Python库。以下是使用Python调用MongoDB和Redis两个流行的NoSQL数据库的示例: 调用MongoDB 要使用Python调用MongoDB,您需要安装pymongo库。您可以使用以下命令在终端或命令提示符中安装它&…...
setTimeout和setInterval定时器的返回值
nodejs中定时器返回Timer对象,window中定时器返回number,所以可以使用ReturnType预定义类型推断—或者使用window.setInterval代替setInterval https://mybj123.com/13153.html...
AWVS深度配置与实战避坑指南:从安装校准到漏洞验证
1. 为什么AWVS不是“点开就扫”的玩具,而是渗透测试中真正能扛事的扫描器很多人第一次听说Acunetix Web Vulnerability Scanner(AWVS),是在某篇标题写着“三分钟上手”的教程里。点开安装包、一路下一步、填个URL、点“开始扫描”…...
书匠策AI:论文写作界的“开挂指南针“,教你用科技把毕业论文从地狱模式调成简单模式!
嗨,各位还在论文泥潭里挣扎的小伙伴们!我是你们的论文科普老司机。 今天咱们不聊怎么堆文献、怎么憋摘要,我要给你们安利一个我偷偷用了两周、直接"真香"的写作神器——书匠策AI( 官网直达:www.shujiangce.…...
ScienceDecrypting:三步永久解锁加密PDF,让学术文献重获自由
ScienceDecrypting:三步永久解锁加密PDF,让学术文献重获自由 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制…...
构建多智能体系统时如何通过统一网关管理不同模型的调用与鉴权
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建多智能体系统时如何通过统一网关管理不同模型的调用与鉴权 在开发集成多个AI智能体的复杂系统时,工程师常常面临一…...
5分钟解锁全皮肤:R3nzSkin国服特供版完全指南
5分钟解锁全皮肤:R3nzSkin国服特供版完全指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 你是否曾为心仪的限定皮肤望而却步࿱…...
AI加速器安全架构:硬件级可信计算与FlexHEG技术解析
1. 前沿AI加速器的安全可信设计架构在当今AI技术快速发展的背景下,前沿AI模型的计算需求呈现指数级增长。根据行业数据,全球AI算力需求每3-4个月就会翻倍,这使得专用AI加速器成为支撑这一增长的核心基础设施。然而,随着AI模型能力…...
JMeter性能测试实战:从接口验证到分布式压测全链路
1. 这不是“点点点就能跑通”的工具,而是你接口质量的守门人很多人第一次打开 JMeter,以为它就是个“高级版 Postman”——填 URL、选方法、点执行,看到绿色小对勾就以为测试完成了。我带过三届测试团队,每届都有至少两个新人在压…...
Windows 11硬件限制绕过终极指南:3种实用方法让老电脑轻松升级
Windows 11硬件限制绕过终极指南:3种实用方法让老电脑轻松升级 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
JMeter生产级接口测试实战:从环境配置到链路稳定性保障
1. 这不是又一篇“点点点”的JMeter入门指南,而是你真正能跑通、调得稳、查得清的接口测试实战手册很多人点开“JMeter教程”四个字,心里想的是:“不就是录个脚本、加个线程组、看个聚合报告吗?”——结果一上手,HTTP请…...
[智能体-28]:Python HTTP 请求库:requests 背景、原理、作用 完整版详解
一、全称与字面含义Requests:英文本意「请求、申请」Python 中:HTTP 请求库二、诞生背景Python 原生自带 urllib、urllib2语法冗长、写法繁琐、兼容性差、使用门槛高。2011 年 Kenneth Reitz 开发 requests口号:HTTP for Humans(给…...
