闭包是什么

一个函数在声明的时候就已经有了自己的词法作用域,当发生函数的嵌套时,会形成作用域和执行上下文的嵌套,但是这样并不算闭包,当函数即使在自己的词法作用域之外执行的时候也可以访问自己的词法作用域的时候,就形成了闭包。

闭包的作用

1.保护作用:闭包可以封装函数中的变量和函数,可以通过闭包来控制内部提供给外部的访问接口,可以防止外部对内部的修改,也可以防止内部和外部的混合造成的混乱,可以通过这种方式,来进行库、模块化的开发,将不同的功能封装起来。
2.保存作用:由于JS的垃圾回收机制,不会对使用中的变量和函数进行回收,使用闭包可以将函数内部的变量、函数的生命周期延长。但是这种方式,会使得闭包内部的数据一直不被回收,过多的闭包会导致内存的大量占用甚至导致内存的泄露。

闭包的返回值

1.返回函数,可以和自执行函数相结合。
2.返回对象(可以用调用对象方法的方式来调用)不过下面的例子中运用了window.xxx来扩展全局的对象。

  1. var f = function(document) {
  2. var viewport;
  3. var obj = {
  4. init: function(id) {
  5. viewport = document.querySelector('#'+ id);
  6. },
  7. addChild: function(child) {
  8. viewport.appendChild(child);
  9. },
  10. removeChild: function(child) {
  11. viewport.removeChild(child);
  12. }
  13. }
  14. window.jView = obj;
  15. };
  16. f(document);
  17. jView.init(xxx);//可以这么调用