JS中的闭包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中的闭包相关的知识,希望对你有一定的参考价值。

想必JS闭包都再熟悉不过了,老生常谈的问题,但是还是要啰嗦几句

有人想问,什么是闭包?用它来做什么?

那么我告诉你,自己去百度搜??

开个玩笑;闭包就是在函数外边可以读取到函数内部变量,本质上就是将函数内部和函数外部连接起来的一座桥梁。

那么它有哪些用途呢?

其实刚刚已经提到了,就是在函数外部可以读取到函数内部的变量,让变量持久化(变量的值会始终保存在内存中)

闭包的原理和机制

在函数func1内部再定义一个函数func2,将局部变量作为函数func2的返回值,在函数func2的外边(func1的里边)将func2返回,此时执行函数func1()();两次即可得到

其实我个人对于一些文字的描述不太感冒,让我看很多遍可能都看不懂,但是如果给我举例子的话我是极其感兴趣的,那么己所欲,施于人(语言表达不好,硬拽??),我也来讲个案例阐述一下

 

function func1(){
		var num1=20;//局部变量num1
		function func2(){
		  console.log(num1);
                  return   num1;//将num1作为函数func2的函数返回值
	   }
		return func2;将函数func2作为函数func1的返回值,返回的是func2函数
}
    var a=func1()();//func1()得到的是func2这个函数,func1()()得到的就是函数func2的返回值num1或者这样写
   var a=func1();
   console.log(a());
   此时就从func1中拿到了num1

 

  这段代码貌似没有什么难度,但是却实现了想要的到的效果(从func1函数中取出num1的值),此时可能有人不明白,想得到num1很简单啊,直接在函数func1里面返回num1不就能得到了吗,好的下面我们来尝试一下

function func1(){
        var num1=20;    
        return num1;
    }
console.log(func1());
此时这段代码结果确实是得到了20(也就是函数内部的num1)

此时感觉脸火辣辣的热??,尴尬极了。后来又仔细又思索几番,觉得不是这么回事,回头看了看闭包的用途,其中有一条是让变量持久化,什么叫持久化?(动手去查),此时我又要讲个案例了??

function func1(){
        var num1=20;    
        return num1++;
   }
var a=func1;
var b=a();
var c=b();
console.log(a(),b,c);
此时打印的结果都是20

那么问题来了,变量并没有持久化?自加操作没有任何作用,那么有什么办法让这个变量像其它的变量一样,此时闭包又派到用场了,

function func1{
            var num1=20;
            function func2(){
                console.log(num1);
                return num1++;
            }
            return func2;
        }
var a=func1();
var b=a();
var c=b();
console.log(a(),b,c);
此时得到的结果为22,2021,那么显然实现了变量自增的操作

那么实现变量持久化了(也就是保存在内存中了),而不是执行完函数丢掉了

其实说了这么多,闭包的用途确实挺大,但是任何事物都有两面性,有利有弊,闭包也不例外

闭包的缺点就是内存消耗很大,就像刚刚说的,它会使变量始终保存咋内存中,所以不能滥用这个闭包,否则后果网页性能肯定..??

如果接触过作用域的话,那么理解闭包应该更容易些(不过我觉得我讲的还算清楚了??),简单提一下作用域

作用域就是变量与函数的可访问范围,作用域控制着变量与函数的可见性和生命周期

作用域分为两种:全局作用域和局部作用域,顾名思义,全局作用域就是代码中的任何地方都能访问到的对象;局部作用域就是只有自己函数内部才可以访问的对象

好了,再好的记性都不如动手去操练一下,尝试一下以上的代码,基本就差不多了??

 

以上是关于JS中的闭包的主要内容,如果未能解决你的问题,请参考以下文章

js 中的闭包

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

js中的闭包问题

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

js中的闭包