1)嵌套函数,内部函数访问了外部函数的局部变量,通过返回内部函数,在函数外部调用内部函数,从而更新外部函数的局部变量的过程;

2)代码执行完成之后离开作用域依旧存在

3)有可能发生内存泄露,若对象的引用计数为0,js自动回收;闭包中,外部引用内部变量,若出现循环引用,比如A引用B,B引用C....造成内存泄漏。

function outers () {
  var num = 1;
  return function () {
    return num+=1;
  }
}
var g = outers();
console.log(g()) //
console.log(g()) //
console.log(g()) //

3)应用

a、封装API

var obj = {} ;
(function(export){
var num = 1 ; //私有变量
export.add = function () {
return num+=1;
} ;
export release = function () { } ;
})(this.obj = { })

b、在循环 / 异步回调中使用闭包,配合IIFE 立即执行的函数表达式

function arrSet(){
  var arr5 = []
  for(var i=0;i<3;i++){
    var obj = {
      id : i,
      add: function (num) {
        return function () {
          return num
        }
      }(i)
    }
  arr5.push(obj)
  }
  return arr5;
}
var arr = arrSet();
console.log(arr[0].add()) // i = 0
console.log(arr[1].add()) // i = 1
console.log(arr[2].add()) // i = 2

最新文章

  1. VIPM 发布功能总结
  2. Image模块
  3. BZOJ4612——[Wf2016]Forever Young
  4. oracle的oci和thin区别(数据源)
  5. ASP.NET Razor——Razor 简介
  6. c# 实现IComparable、IComparer接口、Comparer类的详解
  7. 【BZOJ 3343 】 分块
  8. c# 高效分页只需一个dll实例
  9. C#/.Net Post获取数据流的一种简单写法
  10. Android中view的事件
  11. centos6安装配置zabbix3主控端
  12. socket实现文件传输
  13. Access restriction: The constructor SunJCE() is not accessible 错误
  14. 如何处理由Dll缺失造成的程序直接崩溃的问题。
  15. 为什么要做A.prototype.constructor=A这样的修正?
  16. 转 VB ListView控件各种操作详解
  17. $(function(){}) ,$(document).ready(function(){}),window.onload = function(){...},$(window).load(function(){...})区别
  18. LeetCode 566. Reshape the Matrix (C++)
  19. Activiti Designer 5.14.1插件安装和使用
  20. iOS边练边学--UIPickerView和UIDatePicker的简单使用

热门文章

  1. python之迭代器、可迭代对象、生成器、生成器对象、枚举类型
  2. golang结构体数组
  3. 2019牛客暑期多校训练营(第九场)-D Knapsack Cryptosystem (折半搜索)
  4. Design Log Storage System
  5. Python +requests 关于post请求返回报错
  6. Java 日志系统
  7. 进阶Java编程(8)反射应用案例
  8. C#面向对象11 里氏转换
  9. Laravel 表单验证创建“表单请求”实现自定义请求类
  10. 在vue-cli项目中使用bootstrap