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

闭包面试题原题_闭包 数学闭包面试题原题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 回收机制,结合两者来理解就可以了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Vim:如何退出Vim编辑器?

    Vim:如何退出Vim编辑器?Vim:如何退出Vim编辑器?(笑)这个问题可以说是每个初学者的必经之路咯解决办法如下!请注意非常重要的一点!在vim里面不管何时,直接输入“:”就会在最下面显示出一行,vim开始进入命令模式(而不是write模式)当初自己傻得不行,明知道命令却不知道如何使用,分享给那些一样和我不知道怎么使用命令的…:q//退出:q!//退出且不保存(:quit!的缩写):wq//保存并退出:wq!//保存并退出即使文件没有写入权限(强制保存退出):x//保存并退出(类似:w

  • source insight激活码3.5_source insight4.0安装

    source insight激活码3.5_source insight4.0安装SourceInsight3.x官方下载地址:http://www.sourceinsight.com/distribute/Si3563Setup.exe官方网站:http://www.sourceinsight.com/注册码:SI3US-230590-09757SI3US-840598-11493SI3US-404808-04697SI3US-510811-93484…

  • &0xffffffff(0x08)

    答案是-2为什么呢这里涉及到有符号整型数的补码,正数的补码与原码相同。负数的补码,将其原码除符号位外的所有位取反后加101111111+01111111=11111110符号位溢出了取反10000001再加110000010结果就得-2在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一…

  • 如何使用eclipse软件创建一个Java项目?[通俗易懂]

    如何使用eclipse软件创建一个Java项目?[通俗易懂]同学们在参加Java的时候老师肯定会教给你们如何去创建一个项目,这里怕有些同学没记住,所以单独为大家分享一篇如何使用eclipse软件创建一个Java项目教程,感觉有用的话收藏转发一下~eclipse创建Java项目教程1.首先我们需要打开eclipse软件,之后找到左上角的file选项卡,点击一下依次选择new-Javaproject选项,如图所示。2.随后会打开一个新建页面,在里面我们找到箭头所示的projectname处,在里面填写我们的Java项目名称,直接选择finish即可完成创建。

  • OpenSSL安装成功记

    系统是XP,装了VC6.0和VS2005在Windows下安装OPENSSL,在网上看了很多帖子,照着别人的做,我的总是出错。出错信息cl.exe出错。我想也许是系统的问题吧。我想,把VC6卸载了试试吧。这一试终于看到了胜利的曙光。前提:安装过Perl。安装过程如下:把从官网上下载的openssl-0.9.8k.tar.tar解压缩到C盘。并把文件夹名改为openssl。它的安装目录便是C:/openssl。打开命令行。

  • USART和UART的区别 UART和RS232/RS485的关系是什么?

    USART和UART的区别 UART和RS232/RS485的关系是什么?订阅专栏UART:universalasynchronousreceiverandtransmitter通用异步收发器[BusSignal]TX,RXUSART:universalsynchronousasynchronousreceiverandtransmitter通用同步异步收发器[BusSignal]TX,RX,CKUSART支持同步模式,因此USART需要同步始终信号USART_CK(如STM32单片机),

发表回复

您的电子邮箱地址不会被公开。

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