返回顶部
首页 > 资讯 > 精选 >JavaScript中关于闭包的面试题有哪些
  • 518
分享到

JavaScript中关于闭包的面试题有哪些

2023-06-14 08:06:32 518人浏览 泡泡鱼
摘要

小编给大家分享一下javascript中关于闭包的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每个 JavaScript 程序员都必须知道闭包是什么

小编给大家分享一下javascript中关于闭包的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

每个 JavaScript 程序员都必须知道闭包是什么。在 JavaScript 面试中,你很可能会被问到闭包的概念。

以下是 7 个有关 JavaScript 闭包的面试题,比较有挑战性。

不要查看答案或运行代码,看看自己的水平到底如何。做完这些题大约需要半小时左右。

1. 范围

有以下函数 clickHandlerimmediatedelayedReload

let countClicks = 0;button.addEventListener('click', function clickHandler() {  countClicks++;});const result = (function immediate(number) {  const message = `number is: ${number}`;  return message;})(100);setTimeout(function delayedReload() {  location.reload();}, 1000);

这3个函数中哪个能够访问外部范围变量?

答案
  • clickHandler 能够从外部作用域访问变量 countClicks

  • immediate 无法访问外部作用域中的任何变量。

  • delayedReload 从全局作用域(也就是最外层作用域)中访问全局变量 location

相关教程推荐:javascript视频教程

2.  丢失的参数

下列代码输出什么:

(function immediateA(a) {  return (function immediateB(b) {    console.log(a); // => ?  })(1);})(0);
答案

输出为:0

用参数 0 调用 immediateA,因此 a 参数为 0

immediateB 函数嵌套在 immediateA 函数中,是一个闭包,它从外部 immediateA 作用域中得到 a 变量,其中 a0。因此 console.log(a) 的输出为 0

3. 谁是谁

下面的代码将会输出什么内容?

let count = 0;(function immediate() {  if (count === 0) {    let count = 1;    console.log(count); // 输出什么?  }  console.log(count); // 输出什么?})();
答案

输出 10

第一个语句  let count = 0 声明了一个变量 count

immediate() 是一个闭包,它从外部作用域得到 count 变量。在 immediate()  函数作用域内, count0

但是,在条件内,另一个 let count = 1 声明了局部变量 count,该变量覆盖了作用域之外的 count。第一个 console.log(count) 输出 1

第二个 console.log(count) 输出为 0 ,因为这里的 count 变量是从外部作用域访问的。

4. 棘手的闭包

下列代码输出什么:

for (var i = 0; i < 3; i++) {  setTimeout(function log() {    console.log(i); // => ?  }, 1000);}
答案

输出:3, 3, 3

代码分为两个阶段执行。

阶段1

  1. for() 重复 3 次。在每次循环都会创建一个新函数 log(),该函数将捕获变量 isetTimout() 安排log() 在 1000 毫秒后执行。

  2. for() 循环完成时,变量 i 的值为 3

阶段2

第二阶段发生在 1000ms 之后:

  1. setTimeout() 执行预定的 log() 函数。 log() 读取变量 i 当前的值 3,并输出 3

所以输出 3, 3, 3

5. 错误的信息

下面的代码将会输出什么:

function createIncrement() {  let count = 0;  function increment() {     count++;  }  let message = `Count is ${count}`;  function log() {    console.log(message);  }    return [increment, log];}const [increment, log] = createIncrement();increment(); increment(); increment(); log(); // => ?
答案

输出:'Count is 0'

increment() 函数被调用 3 次,将 count 增加到 3

message 变量存在于 createIncrement() 函数的作用域内。其初始值为 'Count is 0'。但即使 count 变量已经增加了几次,message 变量的值也始终为 'Count is 0'

log() 函数是一个闭包,它从 createIncrement() 作用域中获取 message 变量。 console.log(message) 输出录'Count is 0'到控制台。

6. 重新封装

下面的函数 createStack() 用于创建栈结构:

function createStack() {  return {    items: [],    push(item) {      this.items.push(item);    },    pop() {      return this.items.pop();    }  };}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => [10]stack.items = [10, 100, 1000]; // 栈结构的封装被破坏了

它能正常工作,但有一个小问题,因为暴露了 stack.items 属性,所以任何人都可以直接修改 items 数组

这是一个大问题,因为它破坏了栈的封装:应该只有 push()pop() 方法是公开的,而 stack.items 或其他任何细节都不能被访问。

使用闭包的概念重构上面的栈实现,这样就无法在 createStack() 函数作用域之外访问 items 数组:

function createStack() {  // 把你的代码写在这里}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => undefined
答案

以下是对 createStack() 的重构:

function createStack() {  const items = [];  return {    push(item) {      items.push(item);    },    pop() {      return items.pop();    }  };}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => undefined

items 已被移至 createStack() 作用域内。

这样修改后,从 createStack() 作用域的外部无法访问或修改 items 数组。现在 items 是一个私有变量,并且栈被封装:只有 push()pop() 方法是公共的。

push()pop() 方法是闭包,它们从 createStack() 函数作用域中得到 items 变量。

7. 智能乘法

编写一个函数  multiply() ,将两个数字相乘:

function multiply(num1, num2) {  // 把你的代码写在这里...}

要求:

如果用 2 个参数调用 multiply(num1,numb2),则应返回这 2 个参数的乘积。

但是如果用 1个参数调用,则该函数应返回另一个函数: const anotherFunc = multiply(num1) 。返回的函数在调用 anotherFunc(num2)  时执行乘法  num1 * num2

multiply(4, 5); // => 20multiply(3, 3); // => 9const double = multiply(2);double(5);  // => 10double(11); // => 22
答案

以下是  multiply()  函数的一种实现方式:

function multiply(number1, number2) {  if (number2 !== undefined) {    return number1 * number2;  }  return function doMultiply(number2) {    return number1 * number2;  };}multiply(4, 5); // => 20multiply(3, 3); // => 9const double = multiply(2);double(5);  // => 10double(11); // => 22

如果 number2 参数不是 undefined,则该函数仅返回 number1 * number2

但是,如果 number2undefined,则意味着已经使用一个参数调用了 multiply() 函数。这时就要返回一个函数 doMultiply(),该函数稍后被调用时将执行实际的乘法运算。

doMultiply() 是闭包,因为它从 multiply() 作用域中得到了number1 变量。

以上是“JavaScript中关于闭包的面试题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: JavaScript中关于闭包的面试题有哪些

本文链接: https://lsjlt.com/news/269218.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中关于闭包的面试题有哪些
    小编给大家分享一下JavaScript中关于闭包的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!每个 JavaScript 程序员都必须知道闭包是什么...
    99+
    2023-06-14
  • 关于闭包的面试题有哪些
    本篇内容介绍了“关于闭包的面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!每个 JavaScri...
    99+
    2024-04-02
  • Java面试中有哪些关于String类的面试题
    这篇文章将为大家详细讲解有关Java面试中有哪些关于String类的面试题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。比较两个字符串时使用“==”还是equals()方法?当然是equal...
    99+
    2023-05-31
    java 中有 string
  • 关于Tomcat的面试题有哪些
    本篇内容主要讲解“关于Tomcat的面试题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“关于Tomcat的面试题有哪些”吧!一、什么是TomcatTomc...
    99+
    2024-04-02
  • 关于this的面试题有哪些
    这篇文章给大家介绍关于this的面试题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。问题1:变量 vs 属性下面的打印结果是啥:const object =&...
    99+
    2024-04-02
  • 有哪些关于this的面试题
    这篇文章主要讲解了“有哪些关于this的面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些关于this的面试题”吧!注意:下面的 JavaScrip...
    99+
    2024-04-02
  • Java中关于锁的面试题有哪些
    这篇文章主要介绍Java中关于锁的面试题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;3...
    99+
    2023-06-14
  • 关于Java IO的面试题有哪些
    本篇内容介绍了“关于Java IO的面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1.IO里面的常见类,字节流、字符流、接口...
    99+
    2023-06-02
  • php中关于算法面试题的有哪些
    这篇文章主要介绍了php中关于算法面试题的有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境...
    99+
    2023-06-14
  • Angular中关于单元测试的面试题有哪些
    这篇文章主要介绍了Angular中关于单元测试的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular中的测试有哪些种,基于哪些测试框架Angular的测试...
    99+
    2023-06-15
  • JavaScript中关于“this”的面试题
    这篇文章将为大家详细讲解有关JavaScript中关于“this”的面试题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在 JavaScript 中,this 是函数调用上下文。正是由于 this 的行为...
    99+
    2023-06-14
  • 关于redis缓存的面试题有哪些
    这篇文章将为大家详细讲解有关关于redis缓存的面试题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。redis缓存的面试题1、redis和memcached什么区别...
    99+
    2024-04-02
  • 前端关于HTML的面试题有哪些
    这篇文章主要讲解了“前端关于HTML的面试题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“前端关于HTML的面试题有哪些”吧!1.什么是HTML?HT...
    99+
    2024-04-02
  • 关于angular的前端面试题有哪些
    这篇文章主要介绍了关于angular的前端面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1,ng-if 跟 ng-show/hide 的区别有哪些?第一点区别是,...
    99+
    2023-06-14
  • 关于Python的面试问答题有哪些
    这篇文章主要介绍“关于Python的面试问答题有哪些”,在日常操作中,相信很多人在关于Python的面试问答题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”关于Python的面试问答题有哪些”的疑惑有所...
    99+
    2023-06-16
  • 有哪些关于Java集合的面试题
    本篇内容主要讲解“有哪些关于Java集合的面试题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些关于Java集合的面试题”吧!HashMap和HashTable有何不同?  (1)HashM...
    99+
    2023-06-02
  • Java中关于数据库的面试题有哪些
    这篇文章主要介绍了Java中关于数据库的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。面试题1:说一下你对聚集索引与非聚集索引的理解,以及他们的区别?首先解释一下...
    99+
    2023-06-20
  • Android中关于Binder常见面试题有哪些
    本篇内容主要讲解“Android中关于Binder常见面试题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android中关于Binder常见面试题有哪些”吧!1.简单介绍下binderb...
    99+
    2023-07-02
  • 面试中常见的关于Git的问题有哪些?
    在软件开发行业中,Git已经成为了最常用的版本控制工具之一。因此,在面试过程中,面试官经常会问一些关于Git的问题,以确保应聘者对这个工具有足够的了解。下面我们来看看面试中常见的关于Git的问题有哪些。 Git的基本原理是什么? Git...
    99+
    2023-08-18
    数据类型 面试 git
  • JavaScript有哪些面试题
    这篇文章主要讲解了“JavaScript有哪些面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript有哪些面试题”吧!1.创建JavaSc...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作