当前位置: 首页 > news >正文

闭包--闭包作用之保存(一)

闭包作用解析:保存

  1. 函数执行形成一个私有作用域,函数执行完成,开成的这个栈内存一般情况下都会自动释放
  2. 函数执行完成,当前私有作用哉(栈内存)中的某一部分内容被内存以外的其它东西(变量/元素的事件)占用了,当前的栈内存就不能释放掉,也就形成了不销毁的私有作用域(里面的私有变量也不会销毁)

函数作用域

  1. 函数内部可以访问函数外部的变量,
  2. 函数外部不可以访问函数内部的变量
  3. 当在函数外部定义一个变量,变量在函数内部发生了变化,函数内部和外部都能访问到这个变量
        var a = 1;
        function fn1(){
            a++;
            console.log(a)  //2
        }
        fn1()
        console.log(a)  //2

闭包作用例子:保存

  1. fn():调用完函数,就会释放栈内存
  2. f(): 在函数外面有一个变量接收了这个返回值,此时 当前作用域不能销毁
        function fn() {
            var i = 1;
            return function(n) {
                console.log(n + i++)
            }
        }
        var f = fn();
        f(10);   //11     正确:11,10+1=10,之后1为2,因为f(10),在函数fn()外面调用,故函数fn()里的栈内存不销毁,i一直存在
        fn()(10); //12    正确:11 先执行fn(),之后再执行(10),即f(10),执行fn是重新把所有的流程执行一遍,临时不销毁,当返回结果执行完,没有被占用了,就会释放掉
        f(20);  //21      正确:22  //栈内存没有销毁,20+1
        fn()(20);  //22   正确:21 第二次执行fn是重新把所有的流程执行一遍,和第一次没有任何直接的关系,20+2=22
        function fn() {
            var i = 1;
            return function(n) {
                console.log(n + i++)
            }
        }
        var f = fn();
        f(10);  //11
        f(20); //22
        function fn() {
            var i = 1;
            return function(n) {
                console.log(n + i++)
            }
        }
        var f = fn();
        fn()(10); //11
        fn()(20); //21
        function fn() {
            var i = 1;
            return function(n) {
                console.log(n + i++)
            }
        }
        var f = fn();
        fn()(10); //11
        f(20); //21

举一反三

        var i = 1;
        function fn() {
            return function(n) {
                console.log(n + i++)
            }
        }
        var f = fn();
        f(10); //11
        fn()(10); //12
        f(20); //23
        fn()(20); //24
        function fn(i) {
            return function(n) {
                console.log(n + i++)   
            }
            //console.log(i)  //因为return,所以走不到这一hi
        }
        var f = fn(10);
        f(20); //30       正确:30 
        fn(10)(20); //31   正确:30
        f(30); //40        正确:41
        fn(20)(10); // 31  正确:30
        f(40) //50         正确:52

相关文章:

  • 智能监控在袋鼠云中的应用
  • 一个UML类图示例
  • Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0
  • eclipse 设置python 界面为默认展示
  • HTTP那些事
  • Java浅Copy的一些事
  • Java Log4j 配置文件
  • C++ 编译器
  • Haskell写的Parser
  • Java String.getBytes()编码
  • smm架构的优势
  • 不学无数——SpringBoot入门Ⅲ
  • 比特币的暴跌史
  • 微信小程序直播,腾讯云直播+微信小程序实现实时直播
  • POI导出数据以Excel的方式录入,下载
  • [LeetCode] Wiggle Sort
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • CentOS7简单部署NFS
  • gulp 教程
  • java2019面试题北京
  • PHP CLI应用的调试原理
  • vue:响应原理
  • XML已死 ?
  • 阿里云前端周刊 - 第 26 期
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 多线程 start 和 run 方法到底有什么区别?
  • 服务器之间,相同帐号,实现免密钥登录
  • 聚类分析——Kmeans
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 浅谈Golang中select的用法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 区块链将重新定义世界
  • 驱动程序原理
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 智能合约开发环境搭建及Hello World合约
  • elasticsearch-head插件安装
  • 数据库巡检项
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #AngularJS#$sce.trustAsResourceUrl
  • #每日一题合集#牛客JZ23-JZ33
  • (1)虚拟机的安装与使用,linux系统安装
  • (2015)JS ES6 必知的十个 特性
  • (LeetCode) T14. Longest Common Prefix
  • (笔试题)合法字符串
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉)JSON.stringify 语法实例讲解
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)