1.保存函数执行状态:
Document 保存函数执行状态
性能优化
封装函数
2.封装函数,实现信息隐藏,只暴露接口,外部无法访问内部私有变量,内部变量可以访问外部变量:
var func =(function(){ var arr = []; return { add:function(obj){ arr.push(obj); }, empty:function(){ arr = []; }, getCount:function(){ return arr.length; }, get:function(){ return arr; }, } })();
3.性能优化:
// 闭包使用举例 -- 性能优化1//减少函数定义时间和内存消耗// 不使用闭包,每次执行sum就注册一次add函数。function sum(i, j) { var add = function(i, j){ return i+j; } return add(i, j)}var startTime = new Date();for(var i = 0; i< 1000000; i++) { sum(1,1);}var endTime = new Date();console.log(endTime - startTime); // 使用闭包,不用每次执行sum就注册一次add函数。var sum = (function() { var add = function(i, j){ return i+j; } return function(i,j) { add(i, j); }})();var startTime = new Date();for(var i = 0; i< 1000000; i++) { sum(1,1);}var endTime = new Date();console.log(endTime - startTime);
/**闭包使用举例 -- 性能优化2普通递归函数跟使用闭包记录调用返回结果的递归函数调用次数对比**/// 普通递归函数 var factorial = (function(){ var count = 0; var fac = function(i){ count++; if (i==0) { console.log('调用次数:' + count); return 1; } return i*factorial(i-1); } return fac; })(); for(var i=0;i<=10;i++){ console.log(factorial(i)); }// 使用闭包记录调用返回结果的递归函数 -- 记忆函数var factorial = (function(){ var memo = [1]; var count = 0; var fac = function(i){ count++; var result = memo[i]; if(typeof result === 'number'){ console.log('调用次数:' + count); return result; } result = i*fac(i-1); memo[i] = result; return result; } return fac;})();for(var i=0;i<=10;i++){ console.log(factorial(i)); }