news view

闭包

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。

参考:MDN

闭包的特性

闭包的作用

例子

比如我们定义一个计数器,正常的写法

var count = 0;
function add() {
  return count += 1;
}
add(); // 1
add(); // 2

这样没问题,可以正常实现功能,也很简单方便。但是如果我们要同时实现多个计数器呢,总不能

var count = 0;
function add() {
  return count += 1;
}
var count1 = 0;
function add1() {
  return count += 1;
}
var count2 = 0;
function add2() {
  return count += 1;
}
...

这样一直写吧, 所以这时候就可以使用闭包来实现

function add() {
  var count = 0;
  return function() {
    return count += 1;
  }
}
var fn1 = add(); // 计数器1
var fn2 = add(); // 计数器2
fn1(); // 1
fn1(); // 2
fn1(); // 3
fn2(); // 1
fn2(); // 2
fn2(); // 3

最后总结一下闭包的好处与坏处

好处

坏处

- JavaScript - closure