前端面试题(十六)

news2024/10/11 11:22:12

89. 什么是闭包?

  • 闭包的定义
    闭包是指一个函数可以访问它的词法作用域中的变量,即使这个函数在它的词法作用域之外被调用。换句话说,闭包使得函数可以记住并访问它所在的作用域中的变量,即使该函数在这个作用域之外执行。

  • 闭包的用途

    1. 数据的持久化:闭包可以用于创建私有变量或持久化状态。
    2. 函数工厂:可以用来创建不同作用域中的函数。
    3. 回调函数:在异步操作或事件处理程序中使用闭包,以保持对外部变量的访问。
  • 闭包示例

    function outerFunction(outerVariable) {
      return function innerFunction(innerVariable) {
        console.log('Outer Variable:', outerVariable);
        console.log('Inner Variable:', innerVariable);
      };
    }
    
    const newFunction = outerFunction('外部');
    newFunction('内部');
    

    在这个例子中,innerFunction 是一个闭包,因为它可以访问 outerFunctionouterVariable 变量,即使 outerFunction 已经执行完毕。

90. 作用域链

  • 作用域链的定义
    当访问一个变量时,JavaScript 引擎会首先在当前作用域中查找该变量。如果找不到,它会沿着作用域链向外层作用域查找,直到全局作用域。如果仍未找到,则会抛出 ReferenceError

  • 作用域链的结构

    1. 当前函数作用域。
    2. 外层函数作用域(如果有的话)。
    3. 全局作用域。
  • 作用域链示例

    const globalVar = 'global';
    
    function outerFunction() {
      const outerVar = 'outer';
      
      function innerFunction() {
        const innerVar = 'inner';
        console.log(globalVar); // 'global'
        console.log(outerVar);  // 'outer'
        console.log(innerVar);  // 'inner'
      }
      
      innerFunction();
    }
    
    outerFunction();
    

在这个例子中,innerFunction 可以访问全局变量 globalVar,外层函数 outerVar,以及自身作用域中的 innerVar,这就是作用域链的工作方式。

91. 什么是事件循环(Event Loop)?

  • 事件循环的定义
    事件循环 是 JavaScript 处理异步操作的机制。JavaScript 是单线程语言,它通过事件循环机制使得异步任务不会阻塞主线程,从而实现非阻塞的并发执行。

  • 事件循环的工作原理

    1. 同步任务 被直接放入主线程执行栈中,按顺序执行。
    2. 异步任务(如定时器、网络请求)会被放入 任务队列 中,当主线程执行栈为空时,事件循环会检查任务队列,依次执行任务队列中的任务。
  • 微任务与宏任务

    • 宏任务 (macro task):如 setTimeoutsetInterval、I/O 操作等。
    • 微任务 (micro task):如 Promise.then()MutationObserver 等。
    • 每次事件循环会先清空所有微任务队列,然后再执行一个宏任务。
  • 事件循环示例

    console.log('Start');
    
    setTimeout(() => {
      console.log('宏任务:setTimeout');
    }, 0);
    
    Promise.resolve().then(() => {
      console.log('微任务:Promise.then');
    });
    
    console.log('End');
    

    执行结果:

    Start
    End
    微任务:Promise.then
    宏任务:setTimeout
    

    解释:同步任务先执行,随后执行所有微任务,最后执行宏任务。

92. 什么是跨域?如何解决跨域问题?

  • 跨域的定义
    跨域 是指浏览器执行 XMLHttpRequestFetch 请求时,因 同源策略 限制,不允许访问不同源的资源。同源指协议、域名、端口号必须一致,跨域即其中任一不一致。

  • 跨域的常见解决方法

    1. JSONP (JSON with Padding)

      • 利用 <script> 标签不受跨域限制的特点,通过动态插入 <script> 标签来请求跨域资源。服务端返回一个包含回调函数的 JSON 数据。
      • 缺点:只支持 GET 请求。
      <script>
        function handleResponse(data) {
          console.log(data);
        }
      </script>
      <script src="https://example.com/data?callback=handleResponse"></script>
      
    2. CORS (Cross-Origin Resource Sharing)

      • 服务端设置响应头 Access-Control-Allow-Origin 来允许跨域请求。
      • 示例
        Access-Control-Allow-Origin: https://example.com
        Access-Control-Allow-Methods: GET, POST
        Access-Control-Allow-Headers: Content-Type
        
    3. 代理服务器

      • 通过设置一个代理服务器,由同源的服务器发送请求到不同源的服务器,从而实现跨域。
    4. 服务器端转发

      • 在服务器上设置路由,服务器请求跨域资源并将结果返回给客户端,从而避免浏览器的跨域限制。

93. 防抖与节流

  • 防抖 (Debounce)
    防抖是一种函数优化技术,用于限制函数的执行频率。防抖的关键在于,如果在一定时间内函数再次被触发,计时器将重新计时。适用于输入框输入或窗口调整等频繁触发的事件。

    • 防抖实现
      function debounce(func, wait) {
        let timeout;
        return function (...args) {
          clearTimeout(timeout);
          timeout = setTimeout(() => {
            func.apply(this, args);
          }, wait);
        };
      }
      
      window.addEventListener('resize', debounce(() => {
        console.log('窗口大小已调整');
      }, 500));
      
  • 节流 (Throttle)
    节流同样是一种函数优化技术,但与防抖不同,节流限制的是一段时间内函数只会执行一次。适用于页面滚动或鼠标移动等持续触发的事件。

    • 节流实现
      function throttle(func, limit) {
        let inThrottle;
        return function (...args) {
          if (!inThrottle) {
            func.apply(this, args);
            inThrottle = true;
            setTimeout(() => {
              inThrottle = false;
            }, limit);
          }
        };
      }
      
      window.addEventListener('scroll', throttle(() => {
        console.log('页面正在滚动');
      }, 1000));
      

94. Set 和 Map 的区别

  • Set

    • Set 是一种无序且唯一的集合,可以存储任何类型的值。

    • 常见方法

      • add(value):向 Set 中添加值。
      • has(value):检查值是否存在于 Set 中。
      • delete(value):从 Set 中删除值。
    • Set 示例

      const set = new Set();
      set.add(1);
      set.add(2);
      set.add(2); // 重复值不会添加
      console.log(set.has(1)); // true
      set.delete(1);
      console.log(set); // Set { 2 }
      
  • Map

    • Map 是一种键值对集合,允许任何类型的键。

    • 常见方法

      • set(key, value):向 Map 中添加键值对。
      • get(key):根据键获取值。
      • delete(key):删除键值对。
    • Map 示例

      const map = new Map();
      map.set('name', 'Alice');
      map.set('age', 25);
      console.log(map.get('name')); // 'Alice'
      map.delete('age');
      console.log(map); // Map { 'name' => 'Alice' }
      

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

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

相关文章

OKG Research:如何衡量链上数据的开放价值?

在新加坡Token2049期间&#xff0c;欧科云链研究院受邀参加Bloomberg主办的企业另类资产投资峰会2024&#xff0c;与多位专家围绕未来数据形态与前景进行了深入交流。 活动后&#xff0c;欧科云链研究院负责人Lola Wang与资深研究员Jason Jiang在大公网发表署名文章《如何衡量…

Dinky 字段模式演变 PIPELINE 同步MySQL到Doris

背景 用Dinky数据平台 FlinkCDC收集Mysql BinLog 至 Doris 搭建实时数仓 问题 用Dinky CDCSOURCE 字段模式演变 整库同步Mysql到Doris 字段新增删除不生效 组件信息 Flink 1.17 dinky 1.1 Doris 2.1.6 Mysql 8.0Dinky MySQLCDC 整库到 Doris需要的依赖 Flink/lib 和 dinky/…

家庭酒吧一体化解决方案Bar Assistant

什么是 Bar Assistant &#xff1f; Bar Assistant 是一个用于管理家庭酒吧的自托管应用程序。它允许您添加配料、搜索鸡尾酒和创建自定义鸡尾酒配方。是您所有最爱鸡尾酒配方和饮品的新家。 软件功能&#xff1a; 包含超过 300 个鸡尾酒配方&#xff0c;附带详细信息包含超过…

iPhone 16 Pro 拆解揭秘:设计改进与维修便利性

苹果最新推出的iPhone 16系列在许多方面都进行了更新和改进&#xff0c;而这次我们要聚焦的是其中的高端型号——iPhone 16 Pro。 这款手机不仅在性能上有所提升&#xff0c;在内部构造上也带来了不少变化&#xff0c;让我们一起来看看这些细节吧。 更容易进入的内部结构 对于…

【hadoop报错】JAR does not exist or is not a normal file

1. 环境 linux Ubuntu hadoop 执行 hadoop jar 命令时&#xff0c;一直报错 解决方法 2、确定自己的jar目录是切实存在的 /export/server/hadoop-3.3.6/shares/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar 3、网上找了很多解决办法&#xff0c;最后…

QUUID 使用详解

UUID 通常由 128 位&#xff08;16 字节&#xff09;组成&#xff0c;通常表示为 32 个十六进制数字&#xff0c;分为五个部分&#xff0c;格式如下&#xff1a; QUuid 是 Qt 框架中用于生成和处理 UUID&#xff08;通用唯一标识符&#xff09;的类。UUID 是一种标准的标识符格…

厦门网站制作的趋势与最佳实践

厦门网站制作的趋势与最佳实践 随着数字化时代的到来&#xff0c;厦门的网站制作行业也在不断演变&#xff0c;呈现出多样化的趋势与最佳实践。这些变革不仅满足了市场的需求&#xff0c;也为企业的数字化转型提供了强有力的支持。 首先&#xff0c;响应式设计已成为网站制作的…

自由学习记录(5)

git命令行init仓库 mkdir的命令行使用 -p 是 mkdir 命令中的一个选项&#xff0c;表示 "parent"&#xff0c;意思是创建所有必要的父目录。如果使用 -p&#xff0c;即使父目录不存在&#xff0c;命令也会自动创建它们&#xff0c;而不会报错。 在 Git 中&#xff0…

Android复杂问题分析工具bugreportz详解

文章目录 bugreportz详细介绍功能与作用使用方法生成详细报告检查进度bugreportz 的优势分析报告 如何分析1. 解压 ZIP 文件2. 分析主要文件2.1 bugreport.txt2.2 logcat.txt2.3 kernel.log / last_kmsg2.4 events.log2.5 traces.txt2.6 dumpstate_board.txt 3. 工具支持4. 重点…

计算机的错误计算(一百一十九)

摘要 用错数解释计算机的错误计算&#xff08;一百一十八&#xff09;中的错误计算。 计算机的错误计算&#xff08;一百一十八&#xff09;给出一个循环迭代 用C语言或Java编程计算&#xff0c;则 均是错误结果。 下面用错数解释其出错原因。 首先&#xff0c;将迭代看作 …

ARM base instruction -- umull

无符号乘法运算 Unsigned Multiply Long multiplies two 32-bit register values, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘&#xff0c;并将结果写入64位目标寄存器。 64-bit variant UMULL <Xd>, <Wn>, <Wm&g…

springmvc直接访问 上下文路径 302 后路径更改并跳转源码解析

【问题现状】 application.yml 配置如下属性&#xff1a; server:servlet:context-path: /learning直接访问&#xff1a;http://localhost:8888/learning 路径时&#xff0c;会返回302的响应状态&#xff1b;并跳转路径&#xff1a;http://localhost:8888/learning/ (原路径后…

MapReduce工作机制源码解析

目录 1. MapTask工作机制2. ReduceTask工作机制3. ReduceTask并行度决定机制4. MapTask & ReduceTask源码解析 1. MapTask工作机制 MapTask一共分为五个阶段&#xff1a;Read、Map、Collect、溢写、Merge阶段。 在第4步MrAppMaster启动之前都是job的提交流程&#xff0c;…

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车&#xff0c;卡车&#xff0c;交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…

构造mex(牛客周赛 Round 59)

题目链接&#xff1b; D-构造mex_牛客周赛 Round 59 (nowcoder.com) 题目描述&#xff1a; 输出和输出描述&#xff1a; 输入样例&#xff1a; 3 6 3 3 7 4 3 6 6 0 输出样例&#xff1a; NO YES 4 0 1 2 YES 1 1 1 1 1 1 分析&#xff1a; 数学思维题&#xff0c;赛后看了一…

Spring Cloud Bus:实现分布式系统中的消息传递与状态同步

在分布式系统中&#xff0c;服务之间的消息传递和状态同步是一个关键需求。Spring Cloud Bus提供了一个轻量级的消息代理连接分布式系统的节点&#xff0c;用于广播状态更改或管理指令。本文将探讨Spring Cloud Bus的功能、使用场景及其在分布式系统中的作用。 Spring Cloud B…

【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

Node.js+Express毕设论文选题最新推荐题目和方向

目录 一、前言 二、毕设选题推荐 三、总结 四、附录&#xff08;手册、官网、资源教程等&#xff09; 1. Node.js 官方资源 2. Express 官方资源 3.安装方法 4 创建示例 一、前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者使用…

ARM知识点三和串口代码的编写流程

ARM的一些常见问题 ARM 体系结构的主要特点是什么&#xff1f; 精简指令集 (RISC)&#xff1a;ARM 采用 RISC 结构&#xff0c;指令集较小且简单&#xff0c;执行效率高。相比于复杂指令集 (CISC)&#xff0c;RISC 更强调每条指令的执行速度。低功耗设计&#xff1a;ARM 处理…

在北京能不能设计一款可以多屏展示的调度桌

在北京这座科技与创新并蓄的国际大都市&#xff0c;设计一款集高效、智能与多屏展示功能于一体的调度桌&#xff0c;不仅是一个技术挑战&#xff0c;更是对未来工作场景的一次深刻探索与重塑。那么&#xff0c;在北京能不能设计一款可以多屏展示的调度桌呢? 随着信息技术的飞速…