闭包终了解

闭包这个话题,在前端的学习中始终摆脱不掉,我看书,视频学习闭包多次的情况下,终于把闭包弄明白了。

闭包,在我的理解下,就是函数内部访问外部的变量,这样就形成了闭包,js 整个开发环境其实也算一个大闭包,防抖节流中也使用到了闭包这个概念。

在这里贴一个很有意思的闭包题,当时困扰了我很长时间。

来自《JavaScript 重难点实例精讲》

// 第一个foo()函数
function foo(a, b) {
  console.log(b);
  return {
    // 第二个foo()函数
    foo: function (c) {
      // 第三个foo()函数
      return foo(c, a);
    }
  };
}
let x = foo(0);
x.foo(1); // 0
x.foo(2); // 0
x.foo(3); // 0
let y = foo(0).foo(1).foo(2).foo(3);
var z = foo(0).foo(1);
z.foo(2);
z.foo(3);

在第一个 x=foo(0)里,0 已经被存储到 a 中,返回一个对象,在 x.foo(1)中,虽然传入了新值,但是传递给的是 c 中,上一次的 a 值已经被默认定义为 0,所以打印 0,下面 x.foo(2),x.foo(3)同理,也打印 0。

第二个值中的 y 是进行链式调用,所以第二个值一直在被重新赋值,所以打印结果为 0 1 2

第三个值中的 z 相当于 x y 的混合,在进行赋值之后又进行了一次链式调用,因此该值结果为 0 1 1