闭包-IIFE
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()) // 2 console.log(g()) // 3 console.log(g()) // 4
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