闭包笔记

2019-05-12  本文已影响0人  fejavu

闭包的定义

MDN 的定义

闭包是函数和声明该函数的词法环境的组合。

词法作用域

参考作用域链:

闭包主要是为了:

  1. 封装数据
  2. 暂存数据

闭包案例1

function car() {
  var speed  = 0;
  function fn() {
    speed++;
    console.log(speed);
  }
  return fn;
}

var speedUp = car();
speedUp();  // 1
speedUp();  // 2

闭包案例2
如果想输出3,要如何改造代码?

var fnArr = [];
for(var i = 0; i<10 ;i++) {
  fnArr[i] = function () {
    return i;
  }
}
console.log(fnArr[3]()) //  10

改造1

var fnArr = [];
for(var i = 0; i<10 ;i++) {
  fnArr[i] = (function(j){
    return function() {
      return j;
    }
  })(i)
}
console.log(fnArr[3]()) ;

改造2

var fnArr = [];
for(let i=0;i<10;i++) {
  fnArr[i] = function() {
    return i; 
  }
}
console.log(fnArr[3]());  // 3

闭包案例3
封装 car() 函数,类似 MDN 案例 中模拟私有方法

var car = (function() {
  var speed = 0;
  function set(s) {
    speed = s;  
  }
  function get() {
    return speed; 
  }
  function speedUp() {
    speed++;
  }
  function speedDown() {
    speed--;
  }
  return { 
    set:set,
    get:get,
    speedUp:speedUp,
    speedDown:speedDown
  } 
})()

car.set(30)  // 30
car.get()  //30
car.speedUp()
car.get()  //31
car.speedDown()  //30
car.get()  // 30

闭包案例4
实现一个sum,实现如下调用:

console.log(sum(1)(2));  // 3
console.log(sum(4)(-3));  // 1

// 实现
function sum(i) {
  return function(j) {
    return  i+j;
  }
}

参考阅读

  1. 饥人谷闭包课件,饥人谷
  2. MDN闭包章节,MDN
  3. wikiPedia定义,wikiPedia
上一篇 下一篇

猜你喜欢

热点阅读