js的闭包例题

news2024/11/16 11:54:01

1、垃圾回收
(1)全局变量不会被回收
(2)局部变量会被回收,函数执行结束,函数内部东西会被销毁
(3)某作用域中的某个变量还在被另一个作用域引用就不会被回收

var a=[];
for(var i = 0;i<10;i++){
   var q = i;
   a[i]=function(){console.log(q)}
}
a[0]();//9

首先,for循环不是一个函数作用域,因此变量a,i,q都是同级的。其次,只是将函数赋值给a[i],函数并没有立即执行。for循环执行完毕后,i=10,q=9,因此,执行a[0](),输出qq=9
解决方法:
(1)使用let声明变量
(2)使用闭包

(1)使用let声明变量

var a=[];
for(let i = 0;i<10;i++){
   let q = i;
   a[i]=function(){console.log(q)}
}
a[6]();//6

可以将for循环理解为两个块级作用域:

var a=[];
let i=0;
if(i<10){
	let q = 0;
   a[0]=function(){console.log(q)}
};
let i=1;
if(i<10){
	let q = 1;
   a[1]=function(){console.log(q)}
};

...

let i=9;
if(i<10){
	let q = 9;
   a[9]=function(){console.log(q)}
};

let i=10;
a[6]();

体会以下代码:

for (let i = 0; i < 3; i++) {
   let i = 'abc';
   console.log(i);
}

// abc
// abc
// abc
输出三次abc
可以看出for循环的变量i和循环体中的i在不同作用域中。

(2)使用闭包
闭包特性:
①函数嵌套函数
②内部函数可以访问外部函数的变量
③被访问的参数和变量不会被js垃圾回收机制回收

        var a=[];
        for (var i = 0; i < 10; i++) {
            (function (n) {
            	let q=n;
                a[n]=function(){console.log(q)}
                })(i);
        }
        a[6]();

注:例题1:

		function fc(){
            let n=1;
            function sum(){//函数声明时没有开辟内存空间
                console.log(++n);
            }
            sum();//函数执行时,开辟内存空间压栈
        }
        fc();//2,开辟内存空间,压栈;运行完,出栈,内存被回收
        fc();//2,开辟新的内存空间,压栈,与上面开辟的内存空间是独立的,互不干涉,因此打印的都是2.

在这里插入图片描述
例题2:

		function fc(){
            let n=1;
            return function sum(){//返回函数的内存地址
                console.log(++n);
            }
        }
        let a=fc();//引用函数的内存地址,因此函数fc执行完不会被销毁,会继续使用。
        a();//2
        a();//3
        let b=fc();//重新创建新的内存空间
        b();//2
        b();//3
        
区别:

		function fc(){
            let n=1;
            return n;//此处只是返回n的值,
        }
        let a=fc();//变量a只是得到n的值,因此函数fc执行后其内容会被销毁。

例题3:

		function fc(){
            let n=1;
            return function sum(){
                let m=1;
                function show(){
                    console.log(++m);
                }
                show();
            }
        }
        let a=fc();
        a();//2
        a();//2
        这个例题不是很理解啊!!!!
        函数sum被引用,在外部多次执行sum时,
        show函数会被多次创建新的内存空间,而不是使用原内存空间进行累加,
        为啥呀???
        
区别以下代码:
		function fc(){
            let n=1;
            return function sum(){//函数声明时没有开辟内存空间
                let m=1;
                return function show(){
                    console.log(++m);
                }
            }
            //sum();//函数执行时,开辟内存空间压栈
        }
        let a=fc()();//此处是将show函数返回到外部
        a();//2
        a();//3

例题4:

		var name='The window';
        var obj={
            name:'MY OBJ',
            getNameFunc:function(){
                    return this.name;
            }
        };
        alert(obj.getNameFunc());//MY OBJ
        
区别以下代码:

		var name='The window';
        var obj={
            name:'MY OBJ',
            getNameFunc:function(){
            	return function(){
            		return this.name;
            	}
            }
        };
        alert(obj.getNameFunc()());//The window
//obj.getNameFunc()指向匿名函数function(){ return this.name;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker安装部署实战详细手册

文章目录一、docker介绍1.什么是docker2.为什么使用docker二、docker架构三、docker安装1.安装2.卸载结尾一、docker介绍 1.什么是docker Docker 是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。Docker 可将应用程序和基础设施层隔离&#xff0c; 并且能将基础设施…

docker 部署运行springboot-web.jar

Docker Hub官方公用仓库:https://hub.docker.com 一、docker安装jdk 1.先查看自己需要的版本 2.从仓库中下载 3.查看下载的镜像 4.创建并启动容器 其中(--namejdk1.8 这个jdk1.8是镜像majiajue/jdk1.8别名) docker run -di --namejdk1.8 majiajue/jdk1.8 5.查看是否启动容器…

用PyTorch简单实现线性回归

参考视频&#xff1a;05.用PyTorch实现线性回归_哔哩哔哩_bilibili 还是以y3x2y3x2y3x2为例&#xff08;事先不知道&#xff09; 学习率设为0.01&#xff0c;训练1000次 要注意视频中定义损失函数的部分所用的参数size_averageFalse已经过时&#xff0c;需要改成reduction‘…

深度学习系列1——Pytorch 图像分类(LeNet)

1. 概述 本文主要是参照 B 站 UP 主 霹雳吧啦Wz 的视频学习笔记&#xff0c;参考的相关资料在文末参照栏给出&#xff0c;包括实现代码和文中用的一些图片。 整个工程已经上传个人的 github https://github.com/lovewinds13/QYQXDeepLearning &#xff0c;下载即可直接测试&a…

VLAN trunk扩展 GVRP

目录 一、GVRP产生背景 VTP协议 GARP GVRP 二、GVRP的实现和基本概念 GVRP的应用 GVRP的单向注册 GVRP单向注销 GVRP的注册模式 VTP和GVRP的使用风险 一、GVRP产生背景 VTP协议 如何解决园区网中大批量的VLAN的配置问题&#xff1f; 早期可以使用excel表格配置VL…

小程序开发 - 基本组件

目录 小程序启动过程 页面渲染过程 新建文件夹 组件 view scroll-view swiper和swiper-item button image 小程序启动过程 将小程序代码包下载本地解析app.json全局配置文件执行app.js小程序入口文件&#xff0c;调用App()创建渲染小程序首页小程序启动完成 页面渲染过…

【MQTT基础篇(一)】MQTT介绍

文章目录MQTT介绍1 MQTT历史2 MQTT版本MQTT介绍 MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范&#xff0c;易于实现。这些特点使得它对很多场景来说都是很好的选择&#xff0c;特别是对于受限的环境如机器与机器的通信&…

第七章:项目成本管理

一、规划成本管理 确定如何估算、预算、管理、监督和控制项目成本的过程。主要作用是在整个项目期间为如何管理项目成本提供指南和反向。 输入工具与技术输出 1.项目章程 2.项目管理文件 进度管理计划风险管理计划3.事业环境因素 4.组织过程资产 1.专家判断 2.数据分析 3.会…

SpringMVC学习篇(九)

SpringMVC拦截器例子 1 界面登录验证 1.1 准备工作 1.1.1 导入servlet-api依赖 <dependency><groupId>org.apache.tomcat</groupId><artifactId>servlet-api</artifactId><version>6.0.53</version> </dependency>1.1.2 创…

基于机器视觉的移动消防机器人(三)--软件设计

本文素材来源于北方民族大学 机电工程学院 作者&#xff1a;牟义达、黄瑞翔、李涛 指导老师&#xff1a;田国禾、张春涛 1. 总系统软件流程图 为了实现消防功能&#xff0c;对软件进行系统设计。根据机器人要实现的功能进行逐一设计&#xff0c;设计完之后再将其整合到一起&a…

流体力学基础——粘性

1、粘性&#xff1a;流体的属性 粘性就是流体阻碍自身流动的特性&#xff1b; 专业定义&#xff1a;粘性是流体持续剪切变形时内部产生剪切力的性质&#xff1b; 流体内部的粘性力&#xff0c;类似于固体的摩擦力&#xff0c;但是只有动粘性力&#xff1b; 表面张力不是粘性…

远程桌面一直被人爆破的解决思路

目录前言初步解决方法题外话预防措施获取日志Get-EventLog例子防火墙操作编写软件自动提取IP和添加黑名单调用powershell命令调用cmd命令前言 某天远程自己的电脑发现登不上了&#xff0c;错误信息如下&#xff1a; 开始也没在意&#xff0c;后面出现了好几次才反应过来。查看…

程序员职场生态:近8成本科毕业生起薪过万,跳槽首选智能汽车行业

中国互联网行业经历了超过20年的高速发展&#xff0c;逐渐融入到各行各业&#xff0c;程序员在其中发挥着举足轻重的作用&#xff0c;从业人员数量与日俱增。GitHub数据显示&#xff0c;2021年中国开发者规模达到755万。 近日&#xff0c;拉勾招聘数据研究院对程序员群体开展深…

SpringBoot笔记

文章目录1️⃣ 简介一. 什么是 IoC 容器&#xff1f;二. AOP面向切面编程三. SSM整合四. HttpServletRequest五. HttpServletResponse六. Cookie 与 Session七. Cookie八. Session九. 转发与重定向十. Spring项目转SpringBoot十一. Spring生命周期十二. 什么是 pom十三. 为什么…

知识整理说明:1799962-26-7,(4E)-TCO-NH2,(4E)-反式环辛烯-氨基

(4E)-TCO-amine物理数据&#xff1a; CAS&#xff1a;1799962-26-7| 中文名&#xff1a;(4E)-反式环辛烯-氨基 | 英文名&#xff1a;(4E)-TCO-amine&#xff0c;(4E)-TCO-NH2 结构式&#xff1a; 英文别名&#xff1a; (4E)-TCO-amine 中文别名&#xff1a; (4E)-反式环辛烯…

耗时半月,把牛客网最火Java面试题总结成PDF,涵盖所有面试高频题

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff0c…

Vite 入门篇:学会它,一起提升开发幸福感。

相信大部分兄弟都体验过 Vite 了&#xff0c;知道它很快。但你知道它为什么快&#xff0c;相比 Webpack 有哪些不同吗&#xff1f;今天咱们就来全面了解一下 Vite &#xff0c;尤其适合新手兄弟。话不多说&#xff0c;开整&#xff01; 什么是构建工具 很多人对构建工具没有什…

RE转NFA转DFA

https://github.com/Nightmare4214/re_nfa_dfa 前置知识 ϵ\epsilonϵ代表空串 语言 某个给定字母表上一个任意的可数的串集合 正则语言/正则表达式 正则语言&#xff08;regular language&#xff09;/正则表达式&#xff08;regular expression&#xff09; 每个正则表达…

2022 SpeechHome 语音技术研讨会-回顾

2022年11月13日&#xff0c;第二届SpeechHome语音技术研讨会和第七届Kaldi技术交流会圆满落幕。本届SpeechHome语音技术研讨会由中国计算机学会、深圳市人工智能学会、小米集团、腾讯天籁实验室、语音之家主办&#xff0c;CCF语音对话与听觉专委会作为指导单位&#xff0c;由内…

【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD

接下来介绍一下 NoSQL &#xff0c;相比于 Mysql 等关系型的数据库&#xff0c;NoSQL &#xff08;文档型数据库&#xff09;由于存储的数据之间无关系&#xff0c;因此具备大数据量&#xff0c;高性能等特点&#xff0c;用于解决大规模数据集合多重数据种类带来的挑战&#xf…