首页 > 编程语言 >【JavaScript15】闭包

【JavaScript15】闭包

时间:2023-08-06 21:23:39浏览次数:47  
标签:闭包 function aes console name JavaScript15 xwl

什么是闭包

  • 闭包(closure)是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,即形成一个不销毁的栈环境。
  • 闭包的特性:
    • 函数嵌套函数
    • 内部函数可以访问外部函数的变量
    • 参数和变量不会被回收。

为什么要有闭包?

  • 1、先来看一段代码
    • 发现没有, 在函数内部想要修改外部的变量是十分容易的一件事. 尤其是全局变量. 这是非常危险的. 试想, 我写了一个函数. 要用到name, 结果被别人写的某个函数给修改掉了. 多难受.
let name = "周杰伦";
function chi(){
    name = "吃掉";
}
chi();
console.log(name);
  • 2、接下来. 我们来看一个案例:
//js01
var name = "xwl"

setTimeout(function(){
    console.log("一号工具人:"+name) 
}, 5000);

//js02
var name = "gmm"
console.log("二号工具人", name);

//HTML
<script src="js01.js"></script>
<script src="js02.js"></script>
- 此时,运行代码,返回的name都是"gmm"
- 很明显,  虽然各自js在编写时是分开的. 但是在运行时, 是在同一个空间内执行的. 他们拥有相同的作用域. 此时的变量势必是非常非常不安全的. 那么如何来解决呢?  注意, 在js里. 变量是有作用域的. 也就是说一个变量的声明和使用是有范围的. 不是无限的. 这一点, 很容易验证.
function fn(){
    let love = "爱呀"
}
fn()
console.log(love)   // Uncaught ReferenceError: love is not defined

比较的真实的案例

  • html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="xwl.js"></script>
    <script src="gmm.js"></script>
    <script>
        // 有人要干活了....
        xwl.aes_encrypt();
        xwl.aes_dencrypt();
        xwl.md5();
        gmm();
    </script>
</head>
<body>

</body>
</html>
  • xwl.js
// 函数在执行的时候. 会产生一个局部作用域.
// 这个局部作用域外界是无法进行修改的.
var xwl = (function(){ // 这个名字是为了产生一个局部作用域.
    // aes加密逻辑
    // 定格创建的东西. 是全局作用域
    var key = "xwl的密码";

    function gongjv(){  //  可以对字符串七十二变
        console.log("我是工具")
    }

    function aes_encrypt(){
        gongjv();
        console.log("xwl的AES加密, 用到秘钥", key);
    }

    function aes_dencrypt(){ //解密
        console.log("xwl的AES解密, 用到秘钥", key);
    }

    // 这里把函数送出去...
    // js是没有多个返回值.
    // return aes_encrypt, aes_dencrypt;

    return {
        aes_encrypt: aes_encrypt,
        aes_dencrypt: aes_dencrypt,
        md5:function(){
            console.log("xwl又来新活了. 赶了一个md5");
        }
    }

})();
  • gmm.js
var gmm = (function(){
    // rsa加密逻辑
    // 定格创建的东西. 是全局作用域
    var key = "gmm的密码";

    function rsa_encrypt(){
        console.log("gmm的RSA加密, 用到秘钥", key);
    }

    // 这里把函数送出去...
    return rsa_encrypt;
})();

总结

  • 至此. 何为闭包? 上面这个就是闭包. 相信你百度一下就会知道. 什么内层函数使用外层函数变量. 什么让一个变量常驻内存.等等. 其实你细看. 它之所以称之为闭包~. 它是一个封闭的环境. 在内部. 自己和自己玩儿. 避免了对该模块内部的冲击和改动. 避免的变量之间的冲突问题.
  • 闭包的特点:
      1. 内层函数对外层函数变量的使用.
      1. 会让变量常驻与内存.

标签:闭包,function,aes,console,name,JavaScript15,xwl
From: https://www.cnblogs.com/xwltest/p/17610069.html

相关文章

  • python 闭包变量不允许write,要使用nonlocal
     以下是一段简单的闭包代码示例:deffoo():m=3n=5defbar():a=4returnm+n+areturnbar>>>bar=foo()>>>bar()12是可以的!但是:deffoo():m=3n=5defbar():a=4m+=1#不可以!!!return......
  • 面试代码题(闭包相关)
    vara=10;functionfn1(){returna+10;}functionfn2(){vara=20;returnfn1();}console.log(fn2());第一反应是调用fn1,逐级往上查找a变量,但是经过提醒发现,fn1在定义的时候就已经产生了一个闭包,a就是对于全局a的引用,所以答案是20因为在JS中,变量的......
  • Go defer 去掉闭包函数,靠谱吗?
    在Go中使用defer时,如果defer语句包含了一个闭包函数,需要特别小心。因为defer语句会在函数返回时执行,而闭包函数可能会捕获外部变量,导致意想不到的结果。在Go中,defer语句中的闭包函数捕获的是变量的地址,而不是变量的值。如果闭包函数在defer执行时才被调用,可能会导致捕获的变量值......
  • Python学习笔记:递归、闭包以及装饰器
    一、首先,什么是递归?首先,简单来说递归就是在运行的过程中不断调用自身,从而完成“递”和“归”两个过程。在Python当中递归函数也是这个道理,通过直接或者间接调用函数本身就叫递归函数。注:在Python中编写递归函数一定要有结束条件否则会导致内存溢出。1、Python案例:​ 首先......
  • 编码技巧 --- 谨防C#闭包陷阱
    合集-c#基础(6) 1.编码技巧---如何实现字符串运算表达式的计算07-122.编码技巧---同步锁对象的选定07-133.解读---yield关键字07-174.并发编程---信号量线程同步07-185.并发编程---为何要线程池化07-186.编码技巧---谨防闭包陷阱07-19收起 引言先......
  • useEffect、异步请求、定时器使用useState闭包问题
    useEffect闭包问题:问题:useEffect使用useState会使调用的所有方法内部的state值为useEffect周期的值,即使在这个过程中useState的值变化也不能影响调用方法内获取到原始值解决方式:使用useCallabck可以避免由此产生的闭包问题异步请求、定时器等js闭包问题:问题:异步请求和定时器......
  • 作用域,闭包,原型链,类,继承
    JavaScript作用域和闭包-程序猿的程-博客园(cnblogs.com)详谈JavaScript原型链-程序猿的程-博客园(cnblogs.com)详谈Javascript类与继承-程序猿的程-博客园(cnblogs.com)......
  • rust 自动化测试、迭代器与闭包、智能指针、无畏并发
    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性;Box<T>智能指针在堆上存储数据,Rc<T>智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。自动化测试编写测试以方便我们在后续的迭代过程中,不会改坏代码。保证了程序......
  • 函数定义、调用、闭包
    函数的语法及调用步骤函数是直接在模块/py文件中定义的,与类方法、实例方法有区别。1'''2一、函数的语法:3deffunction_name(parameter1,parameter2,...):4"""函数文档字符串"""5#函数体代码块6#...7returnvalue#可选的返回值8......
  • python闭包_装饰器
    6.python高级知识-闭包装饰器/demo02_闭包.py#-*-coding:utf-8-*-#第一种方法================================#每次都更具汇率和钱都写一遍#这种方法是太烦了print("第一种方法")rate_usa=0.7money=100#print(rate_usa*money)print("第一种方法结束")#......