闭包的应用和其好处

1、什么是闭包?

  • 闭包的概念

闭包就是函数嵌套,让局部变量变成自由变量的环境,是一种让局部变量进化的方式,定义在一个函数内部的函数。

垃圾回收机制:用过一次的东西,先放在一个内存中,不立即删掉,可以随时进行还原或再次使用,直到没有任何作用的时候再清除

2、闭包的应用场景

  1. for循环之中:

for循环之中的i变量会因为for的循环次数被覆盖,所以在for循环内部存在函数时,而且这个函数内会调用i变量,这种情况下就需要用到闭包。

for (var i = 0; i < 10; i++) {
   console.log(i);        //可以访问到每次的i
}
  • 必须满足两个条件:
    1.在for循环内存在函数
    2.函数内会调用这个变量
var ali = document.getElementsByTagName("li");
  for(var i=0;i<10;i++){
    // console.log(ali[i])
    ali[i].onclick = function (){
      console.log(i);        //在函数内部就无法访问到外部变量
    }
 }
var ali = document.getElementsByTagName("li");
  for(var i=0;i<10;i++){
    // console.log(ali[i])
    ali[i].onclick = () => {
      console.log(i);        //在函数内部就无法访问到外部变量
   }
}
var ali = document.getElementsByTagName("li");
  for(var i=0;i<10;i++){
    (function(a){
      ali[a].onclick = function(){
        console.log(a);
      }
    })(i)
  }

一旦内部函数调用外部函数的局部变量,那么这个时候,这个局部变量就会变成内部函数的私有变量

2.当需要给setTimeout的回调函数传参时:

setTimeout(function (a){
    console.log(a); //两秒后,undefined
  }, 2000);
  // 或
  setTimeout(fn(10), 2000);
  function fn(a){
    console.log(a); //没有延迟,直接打印10
  }
  • 使用闭包:
function fn(a){
    return function(){
      console.log(a); //两秒后,10
    }
  }
 var f = fn(10);
 setTimeout(f, 1000);
  • 闭包特点:

闭包是将函数内部和函数外部连接起来的桥梁
可以读取函数内部的变量
让这些变量的值,始终保存在内存中,不会在调用结束后被系统回收
避免全局变量命名空间的污染
内存消耗很大,不能滥用
闭包会在父函数外部,改变父函数内部变量的值

闭包的好处

1.不会污染全局环境;
2.可以进行形参的记忆,减少形参的个数,延长形参生命周期

function add(x) {
  return function (y) {
    return (x + y)
  }
}
var sum = add(2)
console.log(sum(5))

//add2(1)(2)(3) = 6;
function add2(a) {
  return function (b) {
    return function (c) {
      return a + b + c
    }
  }
}
console.log(add2(1)(2)(3))

// add(1, 2, 3)(4) = 10
function add3(a, b, c) {
  return function (d) {
    return a + b + c + d
  }
}
console.log(add3(1, 2, 3)(4))

// add4(1)(2)(3)(4)(5) = 15
function add4(a) {
  return function (b) {
    return function (c) {
      return function (d) {
        return function (e) {
          return a + b + c + d + e
        }
      }
    }
  }
}
console.log(add4(1)(2)(3)(4)(5))

3.方便进行模块化开发

var module = (function () {
    var name = "123";
    function init() {
      console.log(name);
    }
    return {
      getname: init
    }
  })()
  module.getname()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值