资讯专栏INFORMATION COLUMN

闭包面试题原题

plokmju88 / 419人阅读

摘要:闭包面试题原题第一个例子返回返回返回返回第二个例子第三个例子一关于这个函数的执行过程先大致说一下这个函数的执行过程初始化一个具名函数,具名函数就是有名字的函数,名字叫。

闭包面试题原题
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 函数返回之后的执行过程:

返回 fun 函数,但默认不执行,因为在 js 里面,函数是可以保存在变量里面的。

如果想要执行 fun 函数,那么首先会在当前作用域寻找叫fun 名字的具名函数,但是因为当前作用域里 fun 名字的函数是没有被定义的,所以会自动往上一级查找。
2.1 注解:当前的作用域里是一个新创建的对象,并且对象里面只有 fun 属性,而没有 fun 具名函数
2.2 注解:js 作用域链的问题,会导致他会不断地往上级链查找。

在当前作用域没找到,所以一直往上层找,直到找到了顶层的 fun函数,然后执行这个顶层的 fun 函数。

然后这两个 fun 函数会形成闭包,第二个 fun 函数会不断引用第一个 fun 函数,从而导致一些局部变量例如 n,o 得以保存。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97098.html

相关文章

  • 一道js闭包面试题的学习

    摘要:然后最外层这个函数会返回一个新对象,对象里面有一个属性,名为,而这个属性的值是一个匿名函数,它会返回。 最近看到一条有意思的闭包面试题,但是看到原文的解析,我自己觉得有点迷糊,所以自己重新做一下这条题目。 闭包面试题原题 function fun(n, o) { // ① console.log(o); return { // ② fun: function(m) ...

    plus2047 评论0 收藏0
  • 2019春招前端实习面经总结

    摘要:春招前端实习面试记录从就开始渐渐的进行复习,月末开始面试,到现在四月中旬基本宣告结束。上海爱乐奇一面盒模型除之外的面向对象语言继承因为是视频面试,只记得这么多,只感觉考察的面很广,前端后端移动端都问了,某方面也有深度。 春招前端实习面试记录(2019.3 ~ 2019.5) 从2019.1就开始渐渐的进行复习,2月末开始面试,到现在四月中旬基本宣告结束。在3月和4月经历了无数次失败,沮...

    atinosun 评论0 收藏0
  • JavaScript算法题:查找数字在数组中的索引

    摘要:我们必须对数字数组进行升序排序,并找出给定数字在该数组中的位置。算法说明将值第二个参数插入到数组第一个参数中,并返回其在排序后的数组中的最低索引。我们的目标是将输入的数字在输入数组后中排序后,再返回它的索引。 翻译:疯狂的技术宅原文:https://medium.freecodecamp.o... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 编写算法时...

    darkerXi 评论0 收藏0
  • JS三部曲,变量提升,this与作用域,闭包

    摘要:这篇文章总结下之前看的文章和自己在工作中遇到的坑,纯手写的,有什么写的不对的请多多提出修正哈变量提升何为变量提升里面的变量在声明之前就可以使用,因为该声明已经被提升至该作用域函数或全局的顶部直接上代码和都会变量提升优先级上面可理解为函数这时 这篇文章总结下之前看的文章和自己在工作中遇到的坑,纯手写的,有什么写的不对的请多多提出修正哈 变量提升 何为变量提升?js里面的变量在声明之前就可...

    dongxiawu 评论0 收藏0
  • 令人费解的 async/await 执行顺序

    摘要:问题的关键在于其执行过程中的微任务数量,下文中我们需要用上述代码中的方式对微任务的执行顺序进行标记,以辅助我们理解这其中的执行过程。 原文发布在掘金社区:https://juejin.im/post/5c3cc981f265da616a47e028 起源 2019年了,相信大家对 Promise 和 async/await 都不再陌生了。 前几日,我在社区读到了一篇关于 async/...

    WilsonLiu95 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<