闭包-柯里化-局部刷新-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

函数柯里化:预先将函数的某些参数传入,将其保存在内部函数中

function createNum(start) {
  return function (end) {
    return start += end ;
  }
}
var t= createNum(5);
console.log(t(3));  // 8
console.log(t(2)); // 10
应用:
UI局部刷新
function update(index) {
  return function (text) {
    $("div#"+ index).html(text); 
  }
}

ajax请求
function refresh(callback) {
  $.ajax({
    success:function (data) {
      callback(data);
    }
  })
}

猜你喜欢

转载自www.cnblogs.com/yuyedaocao/p/12060297.html