JavaScript 学习下闭包

448 阅读2分钟

什么是闭包

闭包从字面上的含义来讲,就是一个封闭的容器
就是说📦外看不到📦里面的东西

举个🌰

function a () {
  var x = 1
  console.log(x)
  
  function b () {
    var y = 2
    console.log(y)
    
    function c () {
      var z = 3
      console.log(z)
    }
    return c
  }
  return b
}
// 现在假如有三个📦,分别是a、b、c
// a 包含了b,b包含了c
// 这时候a访问不到b,a也访问不到c,b同样也访问不到c
// 

我个人理解的话,内部的b和c两个包,都叫做 闭包

为什么要使用闭包

现在我们知道了什么是闭包了,每个东西我们去学它,肯定得知道它是用来干嘛的
1.隐藏私有变量,防止污染全局变量
2.可以读取内部环境(b包或c包)的变量的值,可以通过return返回包
3.可以让变量存储在内存中,不被刷新

举个🌰

function a () {
  var x = 1
  var y = 2
  
  y = 3
  console.log(y)
  
  function b () {
    y = 4
    console.log(y)
  }
  return b
}
// 如果我把变量都定义在a环境中,这时a可以修改这个变量的值,会造成一些问题

使用场景

场景1 setTimeout(摘自qq_33183637)

for(var i=0; i<5; i++){
  setTimeout(function(){
    console.log(i)
  }, 5000)
}
// 打印5,5,5,5,5

// 使用闭包
for(var i=0; i<5; i++){
  // console.log(i) // 这时候会报错不知道为啥提示console.log不是一个函数
  (function(num){
    setTimeout(function(){
      console.log(num)
    }, 5000) 
  })(i)
}
// 打印0,1,2,3,4

场景2 传一个参数

function add(x) {
  return function (y) {
    return x + y
  }    
}
add(1)(2) // 3
add(4)(5) // 9

场景3 缓存(摘自https://www.cnblogs.com/fanfan-90/p/11921722.html)

function createFab(n) {
  var _cache = {};
  return function (n) {
    var result = 0;
    if (_cache[n]) {
      return _cache[n];
    }
    if (n === 1 || n === 2) {
      result = 1;
    }
    else {
      result = fab(n - 1) + fab(n - 2);
    }
    _cache[n] = result;
    return result;
  }
}
var fab = createFab();
console.info(fab(6));
console.info(fab(6));

闭包内this指向问题

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    console.log(this.name);  // 直接在对象方法里this 指向 Object
    return function(){   
      return this.name; // 为什么是Window呢,因为这里有一个闭包匿名函数,闭包匿名函数通常指向全局
    };
  }
};
alert(object.getNameFunc()());//result:The Window

// 

// 版权声明:本文为CSDN博主「ruanhongbiao」的原创文章,遵循 CC 4.0 BY-SA
// 版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/qappleh/java/article/details/80311443