欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript——那些年,让我们头疼的“闭包”

程序员文章站 2022-07-12 14:48:30
...

1.含义

问:什么是闭包?
答:由于在JavaScript函数中,只有函数内部的子函数才能读取局部变量,因此,可以把闭包简单理解为”函数内部的函数“。所以在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
问:闭包的用处?
答:可以读取函数内部的变量,令这些变量始终保持在内存当中。

2.使用

实例一:闭包简要模型,理解闭包意义
    // 在outside中定义一个变量a,值为888,我们想要在外部使用,正常方式无法使用,此时我们可以使用闭包的形式
    // 在下面示例中,child函数就是闭包
    function outside(){
        let a = 888;
        function child(){
            return a
        }
        return child
    }
    const res = outside()  // 执行outside函数,返回值为child函数
    console.log(res())  // 得到最终的值,还需要执行一下res

上述示例可能不太符合实际,这是用于阐述一种情况。比如可以直接在outside中return a令外部可以访问到,但是涉及操作,值的变化的时候,就会是这样的情况

实例二:每隔1s,打印的内容+1

    // 在outside中定义一个变量a,值为888,我们想要在外部使用,正常方式无法使用,此时我们可以使用闭包的形式
    // 在下面示例中,child函数就是闭包
    function outside(){
        var a = 888;
        function child(){ // 此时a会一直留在内存中,随着定时器不断变化
            a += 1;
            return a
        }
        return child
    }
    const add = outside()  // 执行outside函数,返回值为child函数
    setInterval(()=>{
        console.log(add())   // 889 890 ....
    },1000)

通过闭包的形式,使变量a留在了内存当中,根据定时器不断向上加1,这是例子是否比上面的例子更有说服力呢?

通过以上两个实例我们可以清楚,闭包就是外部函数中的返回值是一个子函数,子函数中有对于外部函数变量的一个操作,使最外部也可以获取到外部函数变量的值。

3.两个有趣的例子

实例一:
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());
实例二:
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
alert(object.getNameFunc()());

// 实例一 弹窗结果The Window
// 实例二 弹窗结果My Object

实例一闭包中this指向为window,若想获取内部变量,可以将闭包改为箭头函数

4.高大上的应用场景

那么大家一直在问的闭包,究竟想要实现什么功能呢?

这个以后会扩充,我困了,大家工作的时候也要注意休息,晚安~

4.闭包弊端

  • 由于闭包会使变量一直存在内存当中,使内存的消耗过大,所以不能滥用闭包,否则会造成性能上的问题,在IE中会导致内存泄漏。所以我们要在函数退出时,将不使用的变量删除
  • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

文章学习来源一,戳他戳他!!

总结用法,希望可以帮助到你,
我是Ably,你无须超越谁,只要超越昨天的自己就好~

相关标签: JavaScript