闭包面试题原题_闭包 数学

闭包面试题原题_闭包 数学闭包面试题原题functionfun(n,o){//①console.log(o);return{//②fun:function(m){//③returnfun(m,n);//④}};}//第一个例子vara=fun(0);/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

图片描述

闭包面试题原题

function fun(n, o) { // ① 
  console.log(o);
  return { // ② 
    fun: function(m) { // ③ 
      return fun(m, n); // ④ 
    }
  };
}

// 第一个例子
var a = fun(0); // 返回undefined
a.fun(1); // 返回 ?
a.fun(2); // 返回 ?
a.fun(3); // 返回 ?

// 第二个例子
var b = fun(0)
  .fun(1)
  .fun(2)
  .fun(3); //undefined,?,?,?

// 第三个例子
var c = fun(0).fun(1);
c.fun(2);
c.fun(3); //undefined,?,?,?

一、关于这个函数的执行过程

先大致说一下这个函数的执行过程:

① 初始化一个具名函数,具名函数就是有名字的函数,名字叫 fun。

② 第一个 fun 具名函数执行之后会返回一个对象字面量表达式,即返回一个新的object对象。

{ // 这是一个对象,这是对象字面量表达式创建对象的写法,例如{a:11,b:22}
fun: function(m) {

return fun(m, n); 

}
}
③ 返回的对象里面含有fun这个属性,并且这个属性里面存放的是一个新创建匿名函数表达式function(m) {}。

④ 在③里面创建的匿名函数会返回一个叫 fun 的具名函数return fun(m, n);,这里需要说明一下这个 fun 函数返回之后的执行过程:

  1. 返回 fun 函数,但默认不执行,因为在 js 里面,函数是可以保存在变量里面的。
  2. 如果想要执行 fun 函数,那么首先会在当前作用域寻找叫fun 名字的具名函数,但是因为当前作用域里 fun 名字的函数是没有被定义的,所以会自动往上一级查找。
    2.1 注解:当前的作用域里是一个新创建的对象,并且对象里面只有 fun 属性,而没有 fun 具名函数
    2.2 注解:js 作用域链的问题,会导致他会不断地往上级链查找。
  3. 在当前作用域没找到,所以一直往上层找,直到找到了顶层的 fun函数,然后执行这个顶层的 fun 函数。
  4. 然后这两个 fun 函数会形成闭包,第二个 fun 函数会不断引用第一个 fun 函数,从而导致一些局部变量例如 n,o 得以保存。

所谓闭包:各种解释都有,但都不是很接地气,简单的来说就是在 js 里面,有一些变量(内存)可以被不断的引用,导致了变量(内存)没有被释放和回收,从而形成了一个独立的存在,这里涉及了js 的作用域链和 js 回收机制,结合两者来理解就可以了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179493.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月21日 下午1:36
下一篇 2022年10月21日 下午1:36


相关推荐

  • GPU利用率低的解决办法

    GPU利用率低的解决办法watch-n0.1-dnvidia-smi#检查GPU利用率参数解决办法:1.dataloader设置参数2.增大batchsize3.减少IO操作,比如tensorboard的写入和打印。4.换显卡

    2022年6月30日
    121
  • 如果不能显示真正的考验个别车型toast问题解决

    如果不能显示真正的考验个别车型toast问题解决

    2022年1月10日
    44
  • Java菜鸟教程 标识符

    Java菜鸟教程 标识符笔者作为一名Java新手,在跟随教程的学习过程中首先接触到的,是标识符。标识符,英文名identifier,词根是identity。顾名思义,它的作用就是给变量、类和方法命名。标识符只能以字母,下划线以及美元符号$开头。如:intabc = 3int$=9int _123=4但是,标识符不能包含除了数字,字母,下划线以及美元符号$之外的其他字符,否则

    2022年6月3日
    42
  • 教你初步了解红黑树

    教你初步了解红黑树教你透彻了解红黑树 nbsp 作者 July saturnman nbsp nbsp 2010 年 12 月 29 日本文参考 Google 算法导论 STL 源码剖析 计算机程序设计艺术 推荐阅读 Left LeaningRed BlackTrees DagstuhlWork Wadern Germany February 2008 直接下载 http www cs

    2026年3月26日
    2
  • python监控网页变化教程_Python实时监控网站浏览记录实现过程详解

    python监控网页变化教程_Python实时监控网站浏览记录实现过程详解需求:(1)获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间,并存在一个txt文件中(2)将这个txt文件发送给指定的邮箱地址(你的邮箱)(3)建立例行任务,每天定时自动完成这些操作,你就可以通过邮件查看你对象每天看啥了准备macOSSierraPython3.6Chrome发送邮件的qq邮箱地址qq邮箱授权码SMTP服务器地址:smtp.qq.com接受邮件的邮箱地…

    2022年7月16日
    20
  • cstring头文件都有什么函数_cstdlib是什么头文件

    cstring头文件都有什么函数_cstdlib是什么头文件cstring中包含许多字符数组的函数:strlen()函数:strlen函数可以得到字符数组中第一个\0前的字符的个数strcmp()函数:strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序strcpy()函数:strcpy函数可以把一个字符串复制给另一个字符串strcat()函数:strcat()可以把一个字符串接到另一个字符串后面sscanf与sprintf用法:假设定义了一个字符数组str[100],如下:sscanf(str,”%d”,

    2025年11月8日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号