zf-fe

✍️ Tangxt ⏳ 2020-06-10 🏷️ JS面试题

19-关于闭包堆栈的一道开胃题(有难度)

★开胃题

function fun(n, o) {
    console.log(o);
    return {
        fun: function (m) {
            return fun(m, n);
        }
    };
}
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);

分析:

我觉得老师出的这个题肯定会在生产环境里边用得上!

输出结果:

  1. undefined
  2. 0
  3. 1
  4. 2

规律? -> 调用fun能够拿到上一次调用fun的传参?

测试自己是否正确?

undefined -> 0 -> 1 -> 1 -> 结果我错了……

为啥错了?因为自己误认为 c.fun(3)0x104调用的!c还是原来那个0x103

考察点:作用域链

作用域链考察

定义函数的时候如果是嵌套着的,那么在内存里边可不是嵌套着的,而是扁平的……说白了,都是独立的……

我们定义的时候嵌套着,意味函数执行的时候,那么其作用域链就会指向该函数定义时所在的那个作用域,即那个VO/AO

★总结