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) {spa
return fun(m, n);
}
}
③ 返回的对象里面含有fun这个属性,而且这个属性里面存放的是一个新建立匿名函数表达式function(m) {}。code
④ 在③里面建立的匿名函数会返回一个叫 fun 的具名函数return fun(m, n);,这里须要说明一下这个 fun 函数返回以后的执行过程:对象
所谓闭包:各类解释都有,但都不是很接地气,简单的来讲就是在 js 里面,有一些变量(内存)能够被不断的引用,致使了变量(内存)没有被释放和回收,从而造成了一个独立的存在,这里涉及了js 的做用域链和 js 回收机制,结合二者来理解就能够了。blog