闭包

  • 闭包有函数和与其相关的引用环境的组合而成
  • 闭包允许函数访问其引用环境中的变量(又称自由变量)
  • 广义上来说,所有 JavaScript 的函数都可以成为闭包,因为 JavaScript 函数在创建时保存了当前的词法环境。
  1. function add() {
  2. var i = 0;
  3. return function() {
  4. alert(i++);
  5. }
  6. }
  7. var f = add();
  8. f();
  9. f();

闭包的应用

保存变量现场

  1. // 错误方法
  2. var addHandlers = function(nodes) {
  3. for (var i = 0, len = nodes.length; i < len; i++) {
  4. nodes[i].onclick = function(){
  5. alert(i);
  6. }
  7. }
  8. }
  9. // 正确方法
  10. var addHandlers = function(nodes) {
  11. var helper = function(i) {
  12. return function() {
  13. alert(i);
  14. }
  15. }
  16. var (var i = 0, len = nodes.length; i < len; i++) {
  17. nodes[i].onclick = helper(i);
  18. }
  19. }

封装

  1. // 将 observerList 封装在 observer 中
  2. var observer = (function(){
  3. var observerList = [];
  4. return {
  5. add: function(obj) {
  6. observerList.push(obj);
  7. },
  8. empty: function() {
  9. observerList = [];
  10. },
  11. getCount: function() {
  12. return observerList.length;
  13. },
  14. get: function() {
  15. return observerList;
  16. }
  17. };
  18. })();