闭包,一个浪漫的故事

2023-05-16

闭包,一个浪漫的故事

今天稍微说一下js中的闭包,这是个新手很少遇到的老手不常遇到的问题,他的出现主要是为了帮我们规避问题,另外提供了一种解决问题的新途径,这里先说明一点啊,虽然最近写的文章理论性比较强很少有代码,但是以后肯定会贴一部分代码的,今天被一个兄弟吐槽了,劈头盖脸一顿骂,说我两年之前写的博客里面代码有问题,考下去不能跑浪费人家时间什么的,这里声明一下,本人发的一切博客都是介于实践基础上的,代码是可运行的,理论当时也是正确的,可能因为随着时间的推进一些api不用了,一些理论废弃了甚至出现了兼容问题,所以大家解决问题的时候尽量找离自己时间比较近的以后的代码我会尽量上传上来,但是博文里我只粘贴部分关键代码,尽量把理论说明白,本人是不欢迎键盘侠的,就那种键盘在手,复制粘贴刷刷写代码,那样也许会完成当前的要求,但是你的代码都没读懂有变化没办法修改不说,万一别人给你植入一个后门你都不知道,好了言归正传

闭包的概念

在之前的学习之中我们都知道,js之中的作用域有两种:局部和全局,这里面需要注意的一个是预加载(上一篇,js说古道今已经提及)另一个就是闭包,不考虑作用域外提(不用var声明的函数内的变量也是全局的,不推荐这种写法),函数内的变量只在函数内起效果,像烟花易冷,转瞬即逝。那么把函数中的私有变量拿出来给其他人使用,或者拿出来变成全局变量的方法,就是闭包。

详解

function f1(){
    var n=999;
    nAdd=function(){
     n+=1
    };
    function f2(){
      alert(n);
    }
    return f2;
  }
var result1=f1();
result1(); // 999
nAdd();
result1(); // 1000

如上,我们把n拿了出来,可以在外边控制n了,当然这里的nAdd是为了能在外边调用才这么写的,平时不赞成这种写法,好奇的同学可以用浏览器的调试功能来查看变量,如果需要的话,也许在以后的某一天会单独讲一下浏览器的基本使用

为什么说闭包浪漫呢?你看啊,函数f1把自己最重要的东西都交给了f2,而f2却把它的使用权交给了别人以至于大家都可以用了,哇,很虐心有木有=v=,爱的毫无防备却被伤的痛彻心扉

function f1(){
    var n=999;
    nAdd=function(){
     n+=1
    };
    function f2(){
      alert(n);
    }
    return f2;
  }
var result1=f1();
var result2=f1();
result1(); // 999
result2(); // 999
nAdd();
result1(); // 999
result2(); // 1000

那么看完以上的你是否明白了呢?看一下这个吧~能不能想到结果是什么呢?

呢?

呢?

呢?

哈,猜不透吧,个人认为这里的原因是这样的:说白了,这里面有两个n,却只有一个nAdd,当我们第一次运行,n变成了全局变量,我们叫他n1,并且它的控制权交给了result1,这个时候nAdd就可以写成n1+=1;后来又运行了一次,上一个全局变量的n1和f1里面的局部变量n肯定井水不犯河水了啊,所以这里面的n我们就叫他n2吧,此时又重新给nAdd赋值了一次(由于他本来就是全局的所以是重新赋值而不是新增)所以我们的nAdd就变成了n2+=1;现在大家知道原因了吧~

如果在我说之前你就看明白了,说明你筋骨惊奇啊,是块练武的材料=v=

多了不说,回归本文,技术是技术,工作是工作,希望大家能更注重技术本身,加强自己对语言的理解能力而不是一味地做个键盘侠,此路长矣,我们一起努力!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闭包,一个浪漫的故事 的相关文章

随机推荐

  • 深度学习二

    BT神经元为按照误 差逆向传播算法训练的多层前馈神经网络 BT神经网络分为输入层 隐藏层 输出层 输入层一般有数据种类多个神经元 xff0c 接受数据 隐藏层的神经元为根号下隐藏层 输出层加b个 xff0c 输入的每个数据加权和返回数之和为
  • Python基础

    一 python代码编译 python 是解释型语 在执 的时候 需要解释器 边解释 翻译 边执 从上到下执 下 代码出现的错误 不会影响上 代码的执 二 python中的三种波浪线 红色波浪线 xff1a 是代码中的错误 需要解决 否则会
  • Word处理控件Aspose.Words功能演示:使用 C# 在 Word 文档中创建和修改 VBA 宏

    Aspose Words 是一种高级Word文档处理API xff0c 用于执行各种文档管理和操作任务 API支持生成 xff0c 修改 xff0c 转换 xff0c 呈现和打印文档 xff0c 而无需在跨平台应用程序中直接使用Micros
  • 建硬盘分区,pvcreate 报:“Can topen /dev/sdb1 exclusivel...?“;磁盘分区报:设备或资源;RHEL本地存储项目二mkfs.vfat报错

    建立硬盘分区 xff0c pvcreate 时报错 xff1a 34 Can topen dev sdb1 exclusively Mounted filesystem 34 dmsetup remove all 清空所有陈旧条目后成功 x
  • 搜索文件内容的几种方式

    搜索文件的几种方式 xff1a 一 提取文件 xff0c 插入数据库text xff0c 使用like 查询 使用poi或PageOffice提取文件内容文字 缺点 xff1a 只适合数据量不大的情况 二 提取文件 xff0c 插入数据库t
  • Centos 7虚拟机ifconfig ens或ip addr时,ens33不显示inet地址

    systemctl stop NetworkManager systemctl disable NetworkManager
  • nodeinternalmodulescjsloader936 throw err; 求解决

    D ethereumDkfuwq gt node app js node internal modules cjs loader 936 throw err Error Cannot find module safe buffer Requ
  • Tomcat 下载安装教程

    文章目录 参考资料1 下载2 安装3 卸载4 启动5 关闭6 配置7 部署8 IDEA使用Tomcat 8 1 集成本地Tomcat8 2 Tomcat Maven插件 参考资料 视频 使用Tomcat的前提是你已经熟练Java xff0c
  • JS说古道今

    JS说古道今 本文概要 讲述js的来源及重要的语法特性 xff0c 包括数据类型 DOM 作用域等 xff08 由于专业性比较强就不写诗扯淡了 61 61 xff0c 我尽量写的有趣点吧 JS JSP xff1f JavaScript xf
  • 删除集合当中的空元素(Collections.singleton(null)与stream())

    Arrays asList创建的数据为定长集合 xff0c 集合长度在操作时是不可以改变的 xff0c 不能对集合进行增删操作 Collections singleton null 相关 span class token comment 反
  • RabbitMQ配置更改TCP默认端口5672

    前言 公司新项目需集成RabbitMQ xff0c 但服务器环境已经安装了ActiveMQ 今天同事不说还不知道 xff0c 导致安装后俩MQ打架 端口冲突 而发生的一系列问题 没办法 xff0c 后来居上的就很被动 xff0c 于是就得改
  • WebSocket服务端消息推送

    前言 xff1a 移动互联网蓬勃发展的今天 xff0c 大部分手机 APP和网站都提供了消息推送功能 xff0c 如新闻客户端的热点新闻推荐 xff0c IM 工具的聊天消息提醒 xff0c 电商产品促销信息 xff0c 企业应用的通知和审
  • tomcat7下载

    百度网盘下载 xff1a 链接 xff1a https pan baidu com s 1qbaxHo0dEdL9JC08yzbL6Q 提取码 xff1a ysz9
  • Springboot查看日志

    Springboot查看日志 以前用springMVC时查看日志直接进入tail f out 但是用了springboot之后 xff0c 一时不知道如何实现 xff0c 记录一下 以下以log4j2为日志框架 先在log4j2 xml中添
  • 爬取CSDN专栏文章到本地,并保存为html、pdf、md格式

    前言 突然想爬取CSDN的专栏文章到本地保存了 xff0c 为了影响小一点 xff0c 特地挑选CSDN的首页进行展示 综合资讯这一测试点是什么找到的呢 xff1f 就是点击下图的热点文章 xff0c 然后跳转到具体文章 xff0c 然后再
  • Spring入门第一讲——Spring框架的快速入门

    Spring的概述 什么是Spring xff1f 我们可以从度娘上看到这样有关Spring的介绍 xff1a 说得更加详细一点 xff0c Spring是一个开源框架 xff0c Spring是于2003年兴起的一个轻量级的Java开发框
  • 手动清理RabbitMq队列中的消息

    一 手动删除队列中指定个数的消息 打开RabbitMq管理页面 xff0c 进入队列 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 二 一次清理队列中的所有消息 打开R
  • 关于Spring核心配置文件中的各项主要配置

    1 xff1a Spring的核心配置文件中的各种配置 spring的核心配置文件的名字 叫做 applicationContext xml xff0c 后期也可以通过配置文件修改名称 xff0c 在web xml中进行如下修改 xff1a
  • JVM内存设置

    对于jvm的设置我一直知道的很少 xff0c 有时候遇到outOfMemoryError只会一个简单的设置 Xms256m Xmx512m 有几个问题一直没搞明白 xff1a 1 jvm的内存大小究竟应该设置成多少最合适 xff1f 2 j
  • 闭包,一个浪漫的故事

    闭包 xff0c 一个浪漫的故事 前 今天稍微说一下js中的闭包 xff0c 这是个新手很少遇到的老手不常遇到的问题 xff0c 他的出现主要是为了帮我们规避问题 xff0c 另外提供了一种解决问题的新途径 xff0c 这里先说明一点啊 x