2024 全新 Javascript 面试题目进阶篇

昨天,咱们介绍了关于Javascript面试篇的基础篇。今天,让我们来看看进阶篇都有什么。

12. 闭包是什么?闭包的使用场景有哪些?

闭包 是一种特性,它使得函数能够捕获其定义时的环境(或者说保留对外部作用域变量的访问),即便该作用域已经关闭。可以说,闭包是函数与其定义时词法环境的组合体。

换句话说,闭包赋予函数访问自身作用域、外部函数作用域以及全局作用域的能力,使它能“记住”并持续访问这些作用域中的变量和参数。

function 外部函数() {let 外部变量 = '我来自外部函数';  return 内部函数() {  console.log(外部变量); // 从外部函数作用域访问外部变量  }  }  let 我的函数 = 外部函数();  
我的函数(); // 输出: 我来自外部函数

每当创建一个函数时,特别是在一个函数内部定义另一个函数时,就会产生闭包。

执行上下文是JavaScript代码执行的环境。每次函数调用时,都会创建一个独立的执行上下文并压入执行栈。一旦函数执行完成,它就会从栈中弹出。

每个执行上下文都有一个内存空间来存储其变量和函数,一旦函数从执行栈中弹出,JavaScript垃圾回收器会清理所有这些内容。

在JavaScript中,只有当没有引用指向某对象时,该对象才会被垃圾回收。

在上述例子中,即使外部函数()已完成执行,匿名执行上下文仍然保持着对外部环境变量的引用。(它能够访问外部变量并在console.log中使用)。

闭包在JavaScript中有几个重要的使用场景:

  1. 数据隐私与封装:闭包可用于创建私有数据并封装功能在有限的作用域内。通过在另一个函数内部定义函数,内部函数可以访问外部函数的变量,而这些变量对函数外部不可见。这使得可以创建不直接从外部访问的私有数据和方法,从而增强数据隐私和封装性。
  2. 状态保持:在处理异步操作和事件处理时,闭包常用于保持状态。例如,在处理异步任务时,闭包可以捕获并保留跨多个异步操作的状态变量,确保在异步任务完成时访问到正确的变量。
  3. 柯里化和偏函数应用:闭包便于实现函数式编程技术,如柯里化和偏函数应用。通过使用闭包捕获并记住特定参数,然后返回使用这些被捕获参数的新函数,可以实现柯里化和偏函数应用。这允许创建具有预设参数的特化函数,提供灵活性和可重用性。
  4. 模块模式:闭包在实现JavaScript的模块模式中至关重要。通过使用闭包创建私有变量并仅公开必要的公共方法,开发者可以创建模块化且组织良好的代码,防止对内部模块数据的非授权访问和修改。
  5. 回调函数:在处理回调函数时,经常使用闭包。闭包可以用来捕获并维护异步操作上下文中变量的状态,确保在回调函数被调用时能访问到正确的变量。

13. 解释JavaScript中的提升(Hoisting)概念。

JavaScript中的提升是指在编译阶段,变量和函数声明会被移动到它们所在作用域的顶部的默认行为。这意味着你可以在代码中声明之前使用变量或调用函数。

使用var声明的变量,其声明会被提升至包含它的函数或块的顶部,并初始化为默认值“undefined”。

console.log(x); // 输出: undefined  
var x = 5;

使用letconst声明的变量也会被提升,但存在一个“暂时性死区”(TDZ),在此期间它们无法被访问。

console.log(x); // 抛出错误(ReferenceError)  
let x = 5;

函数声明同样会被提升至其包含作用域的顶部。你可以在代码中函数声明之前调用函数。

sayHello(); // 输出: "Hello, world!"  
function sayHello() {  console.log("Hello, world!");  
}

箭头函数、函数表达式或变量初始化不会发生提升。

14. 什么是暂时性死区(Temporal dead zone, TDZ)?

暂时性死区(Temporal Dead Zone, TDZ)是JavaScript中与使用letconst声明变量相关的一个概念。

当你使用letconst声明变量时,它们会被提升至所在作用域的顶部,但是与var不同的是,使用letconst声明的变量在TDZ中保持未初始化状态。

在实际声明之前尝试访问或使用该变量,会导致ReferenceError。这是为了防止在变量被正确定义之前就使用它们,以减少潜在的错误。

理解暂时性死区对于预防与变量使用前未初始化相关的错误非常重要。它还促进了遵循最佳实践的JavaScript编码方式,鼓励在使用前正确声明变量。

15. 什么是原型链?Object.create() 方法?

在JavaScript中,每个函数和对象默认都拥有一个名为prototype的属性。每个对象都具备一个原型,这个原型是从当前对象继承属性和方法的另一个对象。你可以把原型想象成一个模板或父对象。

原型链是一种机制,它使得对象能够从其他对象那里继承属性和方法。

当你访问一个对象上的属性或方法时,JavaScript首先会在该对象本身查找。如果找不到,它就会向上遍历原型链,直到找到该属性或方法。这一过程会持续进行,直到到达原型链顶端的Object.prototype

16. 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值,但它接受一个数组作为参数。当传递的参数数量未知或者参数已经在一个数组中时,此方法特别有用。

const numbers = [1, 2, 3, 4, 5];const max = Math.max.apply(null, numbers);
console.log(max); // 输出: 5

bind() 而不是立即调用,它返回一个新的函数,并允许你传递任意数量的参数。bind()方法接受一个对象作为第一个参数,并创建一个新的函数。

const module = {x: 42,getX: function() {return this.x;}
};const boundGetX = module.getX.bind(module);
console.log(boundGetX()); // 输出: 42

17. 什么是lambda或箭头函数?

JavaScript中有两种类型的函数:

  1. 常规函数
  2. 箭头函数(在ES6中引入)

常规函数: 我们可以用两种方式编写常规函数,即函数声明函数表达式

箭头函数(也称为胖箭头函数): 是ES6中引入的一种特性,它是编写函数表达式的更简洁语法。与传统函数表达式相比,它们的语法更短,特别适合于创建匿名函数和使用函数式编程概念。

箭头函数没有声明方式,只能通过函数表达式来定义。

箭头函数与常规函数之间存在一些差异,包括:

  1. 语法
  2. 不支持arguments(参数为类数组对象)
  3. 箭头函数没有自己的原型对象
  4. 不能使用new关键字调用(不是构造函数)
  5. 没有自己的thiscall, apply, 和 bind 不按预期工作)
  6. 不能作为生成器函数使用
  7. 不允许参数名称重复

18. 什么是柯里化函数?

柯里化是一种技术,在函数式编程中,它将一个接收多个参数的函数转换为一系列只接收单个参数的函数。这些柯里化后的函数可以组合起来构建更复杂的函数。

在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

柯里化在函数式编程中非常有用,可以使代码更加模块化和可重用。它特别适用于想要创建具有可变数量参数的函数或构建数据转换管道的场景。

19. ES6有哪些特点?

ES6,也称为ECMAScript 2015,向JavaScript引入了许多新特性和改进,显著扩展了语言的功能。ES6的一些关键特性包括:

  1. 箭头函数
  2. 块级作用域变量
  3. 模块
  4. 模板字面量:允许使用反引号嵌入表达式和多行字符串,提供了创建复杂字符串的更便捷方式。
  5. 默认参数
  6. 剩余与展开运算符
  7. 解构赋值
  8. Promise
  9. Map, Set, WeakMap, WeakSet:ES6引入了新的内置数据结构,如Map和Set,以便更高效地处理集合和键值对。
  10. 迭代器和生成器
  11. 增强的对象字面量

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

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

相关文章

gem5模拟器入门(三)——在配置脚本中添加Cache

使用gem5模拟器入门(二)——创建一个简单的配置脚本-CSDN博客配置脚本作为起点,本章将介绍一个更复杂的配置。我们将向系统添加一个缓存层次结构,如下图所示。此外,本章还将介绍如何理解gem5的统计输出,并向您的脚本添加命令行参数。 1.创建Cache对象 我们将使用经典的缓…

Robot Framework自动化测试基础入门

1、什么是Robot Framework Robot Framework是一个基于Python的关键字驱动的自动化测试框架。以下是关于Robot Framework的几个特点: 基于关键字驱动: 它允许测试人员使用Python封装关键字,这些关键字可以在非编码环境下被用来构建可执行的测试用例。易于扩展: 作为一个开源工…

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题 2024/5/28 16:46 缘起: 现阶段碰到的USB相关的问题:(LINUX R4版本) 1、USB3.0插USB摄像头 lsusb找不到设备 2、刷机口只接了3根线,GND/D/D-,可以…

2024HBCPC:E Breakfast II

题目描述 作为一个合格的大学生,你不仅需要学习成绩好,还需要会买包子和鸡蛋。 今天,又轮到你们给你的导师买早饭了! 这一次你们一共需要给导师买 n n n 个包子和 m m m 个鸡蛋(请注意,这一次可能不再只…

搭贝财务管理助您轻松掌控财务大局

在当今竞争激烈的商业环境中,有效的财务管理是企业成功的关键之一。搭贝财务管理平台为您提供了一揽子解决方案,助您轻松掌握财务大局,实现财务管控的全面数字化。 📈 基础信息管理 搭贝财务管理平台首先提供了完善的基础信息管理…

3D开发工具HOOPS在BIM系统中的应用

建筑信息模型是一种革命性的建筑设计、施工和管理方法。它通过创建和利用数字信息来优化建筑项目的设计、施工和运营过程。在这个过程中,3D开发工具HOOPS扮演着至关重要的角色,为BIM系统提供了强大的技术支持和丰富的功能。HOOPS中文网http://techsoft3d…

RAG架构的数据准备流程

虽然现成的大型语言模型 (LLM) 功能强大,但企业发现,根据其专有数据定制 LLM 可以释放更大的潜力。检索增强生成 (RAG) 已成为这种定制的主要方法之一。RAG 模型将大型语言模型强大的语言理解能力与检索组件相结合,使其能够从外部数据源收集相…

5V升压充电8.4V芯片4A输出电流-AH3330

AH3330-5V升压充电8.4V芯片,采用SSOP-10封装,配备外挂的MOS管,可支持4.5V到32V的输入电压范围,输出功率高达40W。该芯片广泛应用于多节电池充电控制领域,尤其适用于锂电池、磷酸铁锂电池和铅酸电池等不同类型的充电控制…

什么是erp仓储管理系统?ERP系统的价值体现在哪些方面?

ERP仓储管理系统是一个帮助企业管理仓库的工具。想象一下,如果你是一个仓库管理员,里面堆满了各种各样的产品和货物,如何确保这些产品数量准确、摆放有序,以及快速找到自己需要的产品呢? 这时,如果企业引用…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步(主从复制)三台mysql服务器搭建主从复制,要求不可以用root帐号同步,要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置 MySQL主从复制 主从复…

【ARMv7-A】——ATPCS(ARM-Thumb 过程调用标准)

文章目录 ATPCS(ARM-Thumb Procedure Call Standard) ARM-Thumb 过程调用标准寄存器分类和用途通用寄存器(R0-R12)特殊寄存器寄存器使用规则被调用者保存和调用者保存调用者代码被调用者代码数据栈使用规则参数传递规则函数返回规则实践四个参数五个参数

微信小程序【WXML】

wxml wei xin markup language 类似于html 文档 数据绑定 小程序中使用{{}} 来进行数据绑定到模板中&#xff0c;如: wxml中的动态数据全部来自js中的data 简单绑定 //wxml <view> {{text }}</view>// index.js Page({data: {text: hello world}, })属性绑定…

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本&#xff0c;通过修改软链接方式进行欺骗

代码随想录算法训练营Day2|977.有序数组的平方、59.螺旋矩阵||、 209.长度最小的子数组

977.有序数组的平方 这道题给出的原数组有两个特点&#xff1a; 1、由小到大 2、有负数有正数 因此&#xff0c;这个数组平方后的数应该是从两头向中间的0减小的&#xff0c;但是两头的大小需要我们用两个指针便历之后去判断大小。在遍历的同时left指针向右走&#xff0c;righ…

详谈 Java中的list.forEach()和list.stream().forEach() 异同点

涉及的文章链接&#xff1a;ArrayList 循环Remove遇到的坑 一、想总结本篇博客的原因 在日常开发中&#xff0c;需要对集合数据进行或多或少的赋值修改&#xff0c;那么循环赋值或者做一些处理就是最常见的一种操作了&#xff0c;但是用习惯了stream流&#xff0c;所以在循环的…

USST新生训练赛div2+div3题解

目录 前言题解部分B Ichihime and Triangle(800)题目大意题解代码实现 C Kana and Dragon Quest game(900)题目大意题解代码实现 J Squares and Cubes(800)题目大意题解代码实现 F Double Sort(1200)题目大意题解代码实现 I Minimize the Thickness(1100)题目大意题解代码实现 …

分布式事务解决方案(最终一致性【可靠消息解决方案】)

可靠消息最终一致性解决方案 可靠消息最终一致性分布式事务解决方案指的是事务的发起方执行完本地事务之后&#xff0c;发出一条消息&#xff0c;事务的参与方&#xff0c;也就是消息的消费者一定能够接收到这条消息并且处理完成&#xff0c;这个方案强调的是只要事务发起方将消…

自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割| 文献速递-深度学习肿瘤自动分割

Title 题目 Cascade multiscale residual attention CNNs with adaptive ROI for automatic brain tumor segmentation 自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割 01 文献速递介绍 脑肿瘤是大脑细胞异常和不受控制的增长&#xff0c;被认为是神经系统…

监控员工电脑的软件有哪些,不得不说这几款电脑监控软件太好用了

监控员工电脑的软件在市场上种类繁多&#xff0c;以下是几款备受好评的电脑监控软件&#xff0c;它们各自具有独特的功能和优势&#xff0c;选择前必须了解一下才能做成正确决定。 1.安企神&#xff1a; 这款软件支持7天试用测试&#xff0c;获取测试版请移驾 ↓↓↓ 安企神…

Transformer模型的简单学习

前言 Transformer 来源于一篇论文&#xff1a;Attention is all you need TRM在做一件什么事情呢&#xff1f;其实一开始它是被用于机器翻译的&#xff1a; 更详细的&#xff1a; 更详细的&#xff1a; 从上图可以看出&#xff0c;一个Encoders 下面包含了 n 个 Encoder&…