js闭包——简单例子

2023-11-15

闭包:当内部函数被保存到外部时,将生成闭包;闭包会导致原有的作用域链不释放,造成内存泄漏;

如下两个例子:

function test(){
    var tmp = 100;
    function a(){
        console.log(tmp);
    }
    return a;//把里面的函数保存到了外面
}
var demo = test();
demo();//里面的函数在外面调用

也可以不用return,直接赋给全局变量:

var demo;
function test(){
    var tmp = 100;
    function a(){
        console.log(tmp);
    }
    demo = a;//把里面的函数保存到了外面
}
test();
demo();//里面的函数在外面调用

 

简单应用:累加器

一般累加器,可以用全局变量做,每调用一次,count 加1;

var count = 0;
function test(){
    count++;
    console.log(count);
}
test();
test();

但是累加是独立的功能,不应该依赖全局变量(外部)来做,利用闭包的机制就可以实现

function add(){
    var num = 0;
    function a(){
        console.log(++num);
    }
    return a;
}
var myAdd = add();
myAdd();
myAdd();

函数每次执行,都不依赖外部变量,可以实现模块化,而且每次都能加1,因为add 的 AO 对象没有销毁,一直存在;

 

循环打印问题

为了实现打印 0~9,保存了10个function,写了如下代码: 

function test(){
    var arr = [];
    for(var i = 0; i<10; i++){
        arr[i] = function(){
            console.log(i);
        }
    }
    return arr;
}
var myArr = test();
for(var j = 0; j<myArr.length; j++){
    myArr[j]();
}

但是运行结果会发现,打印出是 10 个 10;

原因:这里 arr 在保存的时候,是保存 function,里面的内容还没有执行,所以 function 里面不管写什么,arr[i] 在被赋值的时候都是不知道的,必须等到 myArr[j]() 的时候,此时变量 i 存储在 AO 对象中,i 已经累加到了 10,所以

myArr[j] = function(){console.log(10)};

打印 10 个 10;那么如何打印 0 - 9 呢?这里需要引入立即执行函数

 

立即执行函数

如下:

(function(){
    console.log('a');
    var tmp = 200;
}())

这种写法会立即执行,执行完后会销毁,无法继续调用;

某些函数只执行一次,不想再调用,比如函数计算求值等;

 

写法和注意的问题

写法  ( function(){} () ),可传参,在括号中加入即可;

最后一个括号是执行函数的意思;如果写成 function(){} () 不加括号的时候,浏览器会默认为函数定义 function(){} 加上(),所以还需要加一个括号把所有的括起来。

例如:

//立即函数写法,立即执行打印出3
(function test(a,b){
    console.log(a+b);
}(1,2))

//错误写法,可执行,但是变成函数定义+无意义语句(1,2)
function test(a,b){
    console.log(a+b);
}(1,2)

 

函数表达式写法也可以

var num = (function (a,b){
    return a+b;
}(3,2))
console.log(num);

 

循环打印实现

利用立即执行函数实现,代码如下:

function test(){
    var arr = [];
    for(var i = 0; i<10; i++){
        (function (j){
           arr[j] = function(){
               console.log(j);     
           } 
        }(i))
    }
    return arr;
}
var myArr = test();
for(var j = 0; j<myArr.length; j++){
    myArr[j]();
}

这里实际上相当于生成了10个立即执行函数,即 arr[0] = function(),arr[1] = function(),arr[2] = function()...,而且同时存了10个j,分别是0,1,...,9,其中 j 存在了每个函数的 AO 对象里;所以 myArr 调用的时候,把 j 拿出后, 放入 function 即可;

 

 

 

 

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

js闭包——简单例子 的相关文章

  • 我国网民上网最爱干三件事:娱乐聊天看新闻

    中国互联网信息中心 CNNIC 今日发布第24次中国互联网发展状况统计报告 报告显示 我国网民上网最干的三件事分别是 娱乐 聊天 看新闻 报告称 我网民在网络娱乐 信息获取和交流沟通类网络应用上使用率较高 除论坛 BBS外 这三类网络应用在
  • 27条好赚钱副业的途径:自己也能不用上班月入2万+!

    前言 最近我的知乎号也是越做越好了 很多读者私聊我有没有副业可以做 自己平常除本职的工作之外 也会去做一些其他事情 写公众号 搞搞小视频 偶尔还接点小私活 平常还收了几个小徒弟 然而知乎上很多非相关互联网的也给我咨询了好的 不得不说自己还需
  • 基于孪生网络的单目标跟踪持续汇总

    基于Siamese Network的单目标跟踪持续汇总 Visual Object Tracking 从SiamFC开始 涌现了一大批基于孪生神经网络 Siamese Network 的跟踪算法 其中包括多目标跟踪和单目标跟踪 本文将以Si
  • 51单片机用三种方法实现流水灯(超详细)

    51单片机用三种方法实现流水灯 一 数组流水灯 二 移位函数流水灯 三 移位运算符流水灯 一 数组流水灯 定义一组数组分别对应点亮LED1 7 然后利用for循环赋值给p2从而实现流水灯 include
  • 微信用户的 openid 可能会在以下几种情况下发生变化

    微信用户的 openid 可能会在以下几种情况下发生变化 1 用户重新安装微信应用后 会获得一个新的 openid 2 用户在同一设备上切换微信账号后 该设备上存储的 openid 会刷新 3 微信用户设置了 清除缓存 后 也会获得新的 o
  • 项目2-年收入判断

    文章目录 项目2 年收入判断 友情提示 项目描述 数据集介绍 项目要求 数据准备 环境配置 安装 Logistic回归 数据准备 一些有用的函数 梯度与损失 模型训练 绘制损失和精度曲线 预测测试标签 多变量生成模型 数据准备 平均值和协方
  • 概率图模型(PGM):贝叶斯网(Bayesian network)初探

    1 从贝叶斯方法 思想 说起 我对世界的看法随世界变化而随时变化 用一句话概括贝叶斯方法创始人Thomas Bayes的观点就是 任何时候 我对世界总有一个主观的先验判断 但是这个判断会随着世界的真实变化而随机修正 我对世界永远保持开放的态
  • 三层交换机配置OSPF动态路由

    一 建立拓扑图 二 配置主机IP地址 网关 主机号 IP地址 网关 PC 0 192 168 10 101 192 168 10 1 PC 1 192 168 20 101 192 168 20 1 PC 2 192 168 30 101
  • 在IDEA中建好了一个Maven项目后,启动Tomcat,IDEA控制台输出乱码问题的改善

    前言 当我们在IDEA中新建一个Maven项目后 启动Tcomcat访问指定网页时 在IDEA控制台的output窗口会出现中文乱码的情况 对一些人来说 这样看起来很不舒服 为什么会出现这个问题呢 怎样解决这个问题呢 原因 Tomcat的配
  • gorm操作数据库

    gorm官方学习链接 操作总结 func deploy DeploymentConf Get application server instance string error err DB Table DEPLOYTABLENAME Whe
  • ubuntu18.04安装mosquitto及使用

    1 安装 sudo apt add repository ppa mosquitto dev mosquitto ppa sudo apt get update sudo apt get install mosquitto sudo apt
  • Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

    文章目录 问题 解决方法 拓展 问题 在Android开发中 经常会将工具类以单例模式的方法实现 而工具类中又总不可避免的用到 Context 例如 public class MySingleton private static volat
  • 博客积分规则

    博客积分是CSDN对用户努力的认可和奖励 也是衡量博客水平的重要标准 博客等级也将由博客积分唯一决定 积分规则具体如下 1 每发布一篇原创或者翻译文章 可获得10分 2 每发布一篇转载文章 可获得2分 3 博主的文章每被评论一次 可获得1分

随机推荐

  • 软件测试/测试开发

    公众号搜索 TestingStudio 霍格沃兹的干货都很硬核 测试管理平台是贯穿测试整个生命周期的工具集合 它主要解决的是测试过程中团队协作的问题 在整个测试过程中 需要对测试用例 Bug 代码 持续集成等等进行管理 下面分别从这四个方面
  • C/C++编译器配置——MinGW下载安装

    一 前言 由于重装Win11系统 所有配置环境需要重装 对于C C 编译器MinGW配置做一个简单记录 VS code等软件只提供编辑器 不提供编译器 因此windows系统上的C C 编译器需要通过安装MinGW实现 二 安装过程 在Mi
  • 怎么开发企业微信小程序?

    企业微信小程序是一种基于微信平台的小程序 主要用于企业内部管理和沟通 开发企业微信小程序可以帮助企业提高工作效率和协同能力 同时也能够提升企业形象和品牌价值 本文将介绍如何使用小程序制作工具来开发企业微信小程序 一 了解企业微信小程序的优势
  • DevOps系列之 —— 持续开发与集成(五)华为云 DevCloud 代码托管服务及 CloudIDE

    DevOps系列之 DevOps概览 一 软件产业和交付模式发展趋势 DevOps系列之 DevOps概览 二 新型软件技术及交付模式 DevOps系列之 DevOps概览 三 DevCloud HE2E DevOps 框架及其主要服务 D
  • Linux基本指令(ls、pwd、cd、touch、mkdir、rmdir、rm、man、cp、mv、cat、tac、more、less)

    在Linux中文件后缀与文件类型无关 一 ls 功能 对于目录 该命令列出该目录下的所有子目录与文件 对于文件 将列出文件名以及其他信息 1 ls a 列出目录下的所有文件 包括以 开头的隐含文件 目录 ls 与ls a 以 开头是隐藏文件
  • could not create the java virtual machine

    今天早上突然打开不了myeclipse eclipse 每次启动都报错 could not create the java virtual machine 开始以为是java虚拟机出了问题 于是卸了重装还是出现如此问题 接着到网上查找相关资
  • 酒店评论情感分析,亲妈级教程

    酒店评论情感分析 采集与分词篇 开篇吐槽一下下 类似携程这种生活类网站 还有电商类网站 不是驻守被爬的城墙内就是在反爬的道路上行走 不断的更新加密 批量化的采集不断破解并升级程式 并在网络之上布施教程 小白们熬夜拼命的学习 做一个流水线般的
  • Linux Shell函数返回值

    Shell函数返回值 一般有3种方式 return argv echo 1 return 语句 shell函数的返回值 可以和其他语言的返回值一样 通过return语句返回 示例 bin bash function mytest echo
  • PyTorch模型导出到ONNX文件示例(LeNet-5)

    从PyTorch模型导出到ONNX文件是通过调用PyTorch的torch onnx export接口实现 torch onnx export 如果pytorch模型既不是torch jit ScriptModule也不是orch jit
  • shiro反序列化漏洞Shiro-550/Shiro-721反序列化

    文章目录 shiro反序列化漏洞 Shiro 550反序列化漏洞 CVE 2016 4437 漏洞简介 漏洞原理 Shiro 721反序列化漏洞 CVE 2019 12422 Shiro550和Shiro721的区别是什么 漏洞指纹 漏洞介
  • postman-常见问题解决方案记录

    1 Response body Containing string为中文 Response body Containing string 为中文时 转换为unicode编码 并添加转义符 2 get方式与post请求使用环境变量 post方
  • ctfshow web2

    ctfshow web2 writeup 这是本人第一次写blog 有不好的地方希望大家多多指出 从此开始踏上了网安的不归路 成为了一只web狗 从题目可以看出这是一道sql注入的题 示例 pandas 是基于NumPy 的一种工具 该工具
  • 看懂Oracle执行计划

    略有所知 也来总结一下自己最近所学 不定时更新ing 一 什么是Oracle执行计划 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二 怎样查看Oracle执行计划 PLSQL远程连接的公司数据库 所以以PLSQL为例
  • Webots安装和教程推荐

    安装与推荐 软件介绍 Webots是一款专业的物理仿真软件 被广泛运用在机器人 智能车仿真实践控制算法中 2018年12月该软件宣布开源 Webots最初采用C进行编程 至今已经实现提供C C Python Java Matlab接口的AP
  • JS setAttribute()方法:设置元素的属性值

    在 JavaScript 中 使用元素的 setAttribute 方法可以设置元素的属性值 用法如下 setAttribute name value 参数 name 和 value 分别表示属性名称和属性值 属性名和属性值必须以字符串的形
  • 用户政策和隐私协议

    杭州宜果送信息科技有限公司 以下简称 宜果送 重视用户的隐私 宜果送隐私政策 更新日期 2022年1月18日 提示条款 您的信任对我们非常重要 我们深知个人信息对您的重要性 我们将按法律法规要求 采取相应安全保护措施 尽力保护您的个人信息安
  • 隔离式栅极驱动器输入级对电机驱动应用的影响

    介绍 在电机驱动应用中为功率级选择隔离式栅极驱动器时 您有多种选择 栅极驱动器可简单可复杂 具有集成米勒箝位 分离输出或绝缘栅双极晶体管 IGBT 发射极的欠压 UVLO 锁定参考等功能 输入级有两个选项 电压输入级或电流输入级 在本文中
  • Visual Studio问题汇总

    合并两个vs解决方案 不能 下载别人的vs程序易出现sdk不符合等问题 项目右键属性 目标版本平台 平台工具集 都改为自己已有的就行了 还要注意配置和平台对应哦 1 问题 Callback 模板 从属名称的使用必须以模板为前缀 解决 项目右
  • 大一Python期末复习笔记

    目录 前言 一 输出格式控制 多行输出 不换行输出 精度保留和对齐 format f 二 嵌套 嵌套循环 for while 嵌套列表 字典 三 列表与字符串 添加元素 切片访问与逆序 join count find index 删除与替换
  • js闭包——简单例子

    闭包 当内部函数被保存到外部时 将生成闭包 闭包会导致原有的作用域链不释放 造成内存泄漏 如下两个例子 function test var tmp 100 function a console log tmp return a 把里面的函数