首页 > 编程语言 > 详细

浅谈JavaScript闭包

时间:2021-08-12 23:26:01      阅读:42      评论:0      收藏:0      [点我收藏+]

什么是JS闭包?

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。

闭包的用途

闭包有两个常用的用途:

  1.使我们在函数外部能够访问到函数内部的变量。

  2.使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。

闭包的应用

闭包可以构造函数的私有属性、对函数进行节流、防抖操作。但是如果我们滥用闭包,函数中的变量都被保存在内存中,内存消耗很大,造成网页的性能问题,且容易造成内存泄漏。解决方法是在退出函数之前,将不使用的局部变量全部删除。

代码理解

  • 定义假设我们定义函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包。
function A() {
  let a = 1
  function B() {
      console.log(a)
  }
  return B
}
  • 举例:解决循环中使用闭包解决 var 定义函数的问题
for ( var i=1; i<=5; i++) {
    setTimeout( function timer() {
        console.log( i );
    }, i*1000 );
}
  • 首先我们知道 setTimeout 是个异步函数,所有会先把循环全部执行完毕,那么这时候 i 就是 6 了,所以结果会输出一堆 6
  • 如何解决?有三种办法:
  • 1.使用闭包
for (var i = 1; i <= 5; i++) {
  (function(j) {
    setTimeout(function timer() {
      console.log(j);
    }, j * 1000);
  })(i);
}
  • 2.使用 setTimeout 的第三个参数
for ( var i=1; i<=5; i++) {
    setTimeout( function timer(j) {
        console.log( j );
    }, i*1000, i);
}
  • 3.使用let定义

  varlet的主要区别在于:let作用域是块级的,而不是函数级别的。这就意味着使用let关键字创建的变量在创建它的“块”内以及任何嵌套块中都可用。说的“块”指的是在for循环或if语句中用花括号{}包围的任何东西。

{ // 形成块级作用域
  let i = 0
  {
    let ii = i
    setTimeout( function timer() {
        console.log( i );
    }, i*1000 );
  }
  i++
  {
    let ii = i
  }
  i++
  {
    let ii = i
  }
  ...
}

 

浅谈JavaScript闭包

原文:https://www.cnblogs.com/sgq99/p/15134377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!