闭包面试题原题

图片描述

闭包面试题原题

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,?,?,?

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

先大体说一下这个函数的执行过程:面试

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

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

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

return fun(m, n);

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

④ 在③里面建立的匿名函数会返回一个叫 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 回收机制,结合二者来理解就能够了。blog

相关文章
相关标签/搜索