作用域和闭包的通俗理解千古壹号

在执行全局代码前将window确定为全局执行上下文。

(1)对全局数据进行预处理:(并没有赋值)

(2)开始执行全局代码

在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象(虚拟的,存在于栈中)。

(1)对局部数据进行预处理:

(2)开始执行函数体代码

this指的是,调用函数的那个对象。this永远指向函数运行时所在的对象。

解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this。

根据函数的调用方式的不同,this会指向不同的对象:【重要】

需要特别提醒的是:this的指向在函数定义时无法确认,只有函数执行时才能确定。

this的几种场景:

例如:

functionFoo(name){//this={};this.name=name;//returnthis;}varfoo=newFoo();varobj={name:'A',printName:function(){console.log(this.name);}}obj.printName();functionfn(){console.log(this);//this===window}fn();作用域作用域指一个变量的作用范围。它是静态的(相对于上下文对象),在编写代码时就确定了。

作用:隔离变量,不同作用域下同名变量不会有冲突。

作用域的分类:

if(true){varname='smyhvae';}console.log(name);上方代码中,并不会报错,因为:虽然name是在块里面定义的,但是name是全局变量。

直接编写在script标签中的JS代码,都在全局作用域。

在全局作用域中:

全局作用域中的变量都是全局变量,在页面的任意的部分都可以访问到。

举例1:

console.log(a);vara=123;打印结果:undefined

举例2:

console.log(a);a=123;//此时a相当于window.a程序会报错:

所以说,下面的例子,会报错:

调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。

每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的。

在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量。

在函数中要访问全局变量可以使用window对象。(比如说,全局作用域和函数作用域都定义了变量a,如果想访问全局变量,可以使用window.a)

提醒1:

vara=1;functionfoo(){console.log(a);a=2;//此处的a相当于window.a}foo();console.log(a);//打印结果是2上方代码中,foo()的打印结果是1。如果去掉第一行代码,打印结果是UncaughtReferenceError:aisnotdefined

functionfun6(e){console.log(e);}fun6();//打印结果为undefinedfun6(123);//打印结果为123作用域与执行上下文的区别区别1:

区别2:

联系:

当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用(就近原则)。如果没有则向上一级作用域中寻找,直到找到全局作用域;如果全局作用域中依然没有找到,则会报错ReferenceError。

外部函数定义的变量可以被内部函数所使用,反之则不行。

Title理解:

查找一个变量的查找规则:

vara=1functionfn1(){varb=2functionfn2(){varc=3console.log(c)console.log(b)console.log(a)console.log(d)}fn2()}fn1()闭包闭包就是能够读取其他函数内部数据(变量/函数)的函数。

只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量或函数时,就产生了闭包。

使用chrome调试查看

注意:闭包存在于嵌套的内部函数中。

来看看条件2:

functionfn1(){functionfn2(){}returnfn2;}fn1();上面的代码不会产生闭包,因为内部函数fn2并没有引用外部函数fn1的变量。

上面的代码中,虽然调用了内部函数两次,但是,闭包对象只创建了一个。

也就是说,要看闭包对象创建了一个,就看:外部函数执行了几次(与内部函数执行几次无关)。

functionshowDelay(msg,time){setTimeout(function(){//这个function是闭包,因为是嵌套的子函数,而且引用了外部函数的变量msgalert(msg)},time)}showDelay('atguigu',2000)上面的代码中,闭包是里面的funciton,因为它是嵌套的子函数,而且引用了外部函数的变量msg。

我们让然拿这段代码来分析:

functionfn1(){vara=2functionfn2(){a++console.log(a)}returnfn2}varf=fn1();//执行外部函数fn1,返回的是内部函数fn2f()//3//执行fn2f()//4//再次执行fn2作用1分析:

上方代码中,外部函数fn1执行完毕后,变量a并没有立即消失,而是保存在内存当中。

作用2分析:

函数fn1中的变量a,是在fn1这个函数作用域内,因此外部无法访问。但是通过闭包,外部就可以操作到变量a。

达到的效果是:外界看不到变量a,但可以操作a。

比如上面达到的效果是:我看不到变量a,但是每次执行函数后,让a加1。当然,如果我真想看到a,我可以在fn2中将a返回即可。

回答几个问题:

答案:一般是不存在,存在于闭中的变量才可能存在。

闭包能够一直存在的根本原因是f,因为f接收了fn1(),这个是闭包,闭包里有a。注意,此时,fn2并不存在了,但是里面的对象(即闭包)依然存在,因为用f接收了。

不能,但我们可以通过闭包让外部操作它。

(1)myModule.js:(定义一个模块,向外暴露多个函数,供外界调用)

functionmyModule(){//私有数据varmsg='SmyhvaeHaha'//操作私有数据的函数functiondoSomething(){console.log('doSomething()'+msg.toUpperCase());//字符串大写}functiondoOtherthing(){console.log('doOtherthing()'+msg.toLowerCase())//字符串小写}//通过【对象字面量】的形式进行包裹,向外暴露多个函数return{doSomething1:doSomething,doOtherthing2:doOtherthing}}上方代码中,外界可以通过doSomething1和doOtherthing2来操作里面的数据,但不让外界看到。

(2)index.html:

05_闭包的应用_自定义JS模块varmodule=myModule();module.doSomething1();module.doOtherthing2();方式二同样是实现方式一种的功能,这里我们采取另外一种方式。

(1)myModule2.js:(是一个立即执行的匿名函数)

(function(){//私有数据varmsg='SmyhvaeHaha'//操作私有数据的函数functiondoSomething(){console.log('doSomething()'+msg.toUpperCase())}functiondoOtherthing(){console.log('doOtherthing()'+msg.toLowerCase())}//外部函数是即使运行的匿名函数,我们可以把两个方法直接传给window对象window.myModule={doSomething1:doSomething,doOtherthing2:doOtherthing}})()(2)index.html:

05_闭包的应用_自定义JS模块2myModule.doSomething1()myModule.doOtherthing2()上方两个文件中,我们在myModule2.js里直接把两个方法直接传递给window对象了。于是,在index.html中引入这个js文件后,会立即执行里面的匿名函数。在index.html中把myModule直接拿来用即可。

总结:

当然,方式一和方式二对比后,我们更建议采用方式二,因为很方便。

但无论如何,两种方式都采用了闭包。

解决:能不用闭包就不用,及时释放。比如:

f=null;//让内部函数成为垃圾对象-->回收闭包总而言之,你需要它,就是优点;你不需要它,就成了缺点。

内存泄漏:占用的内存没有及时释放。内存泄露积累多了就容易导致内存溢出。

常见的内存泄露:

情况1举例:

//意外的全局变量functionfn(){a=newArray(10000000);console.log(a);}fn();情况2举例:

//没有及时清理的计时器或回调函数varintervalId=setInterval(function(){//启动循环定时器后不清理console.log('----')},1000)//clearInterval(intervalId);//清理定时器情况3举例:

functionfn1(){vararr=newArray[100000];//这个数组占用了很大的内存空间functionfn2(){console.log(arr.length)}returnfn2}varf=fn1()f()f=null//让内部函数成为垃圾对象-->回收闭包内存溢出(一种程序运行出现的错误)内存溢出:当程序运行需要的内存超过了剩余的内存时,就出抛出内存溢出的错误。

THE END
1.指向作用的定义是什么?这种作用在不同领域中有何具体应用?指向作用,简单来说,是一种引导、指示或明确方向的效应或功能。它能够帮助人们在复杂的情境中找到重点、确定目标,从而更有效地采取行动。 在教育领域,指向作用体现得尤为明显。教师通过精心设计的教学方法和课程安排,为学生指明学习的方向和重点。例如,在数学教学中,教师会指出关键的概念和定理,引导学生理解和掌握,这就https://funds.hexun.com/2024-12-15/216192112.html
2.C++接口的实现,及作用通俗理解方式腾讯云开发者社区C++ 接口的实现,及作用通俗理解方式 接口 C++中的接口,一般就是指抽象类,是一种用来描述类对外提供的操作、方法或功能的集合——注意,一般只是描述(声明),而不对这些方法或功能进行定义实现,通常在类的继承或多态中作为基类使用,这种用法也与其特性有关。值得一提的是,接口中的方法或功能一般需要在派生类中进行https://cloud.tencent.com/developer/article/2397349
3.通俗易懂理解内存和磁盘的作用和关系存储器和磁盘的关系通俗易懂理解内存和磁盘的作用和关系 内存是什么 计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构。由于处理对象数据是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘。 内存实际上是一种名为内存IC 的电子元件。虽然内存IC 包括DRAM、SRAM、ROMA 等多种形式,但从外部来看,其基本机制都https://blog.csdn.net/zhenpixiaoyang/article/details/125360417
4.施扣柱∣民国上海如何理解教育文化——以上海教育行政机构的功能民国上海如何理解教育文化 ——以上海教育行政机构的功能设置为讨论中心 施扣柱 上海社会科学院历史研究所副研究员 对于教育文化的研究可以从各个角度切入,教育行政机构功能设置的讨论也是题中之意。这些功能设置的背后隐含着对教育文化的学理认知,但教育行政对辖地教育文化的主要影响在于现实层面直接型塑其样貌。 http://www.iase.ecnu.edu.cn/bc/89/c12930a179337/page.htm
5.2021年导游资格考试《导游业务》章节辅导:第七章第一节 导游语言艺术的功能和作用 导游语言艺术是导游艺术的一个重要方面,它贯穿于导游交往、导游讲解、问题处理和生活照料等导游服务的各个领域。因此,导游人员学习和掌握导游语言艺术对做好导游服务工作至关重要。 一、导游语言的概念与特点 (一)导游语言的概念 https://www.hqwx.com/web_news/html/2021-9/16305740997714.html
6.说明文的说明方法分析说明文篇章结构,理清文章思路,重在引导学生理解说明层次的科学性和逻辑性。 三、了解说明文的说明方法及作用 为了把事物的特征说清楚,或把事理阐述清楚,说明文往往采用恰当的说明方法。常用的说明方法有:下定义、举例子、分类别、打比方、作比较、摹状貌等。恰当的说明方法能将深奥复杂的知识通俗化、简单化,将抽象https://www.yuwenmi.com/zuowen/shuomingwen/3623859.html
7.什么是CA数字证书?了解数字证书的基本概念和作用在数字化时代,网络安全变得至关重要。为了确保数据的隐私性、完整性和可靠性,我们经常听说数字证书和CA数字证书这样的术语。那么,什么是CA数字证书?它又有什么作用呢?本文将以通俗易懂的语言来解释CA数字证书的基本概念和作用。 第一部分:什么是数字证书?数字证书是一种用于识别和验证身份的电子文件。类比现实生活中https://shenzhen.11467.com/info/21649332.htm
8.运动功能三大系统无论是普通人或运动员,只要是从静止到力竭(时间足够长),三大功能系统要逐一发挥作用的,顺序是不会变的,但是根据运动强度大小,其能耗阶段是不一样的。有一些论点说供能方式是和时间没有关系的,不知从何说起。如果时间足够短,耗能只停留在磷酸原第一阶段就停止了,就没有三大供能系统逐一显显身手了。https://www.meipian.cn/ykjvq2a
9.政治组大教研组教学教研九、不能准确理解量变与质变的关系 9.维生素是维持人体正常功能的基本要素,一些普通百姓据此认为,大量服用某些维生素有益于身体健康,但一些科学家则警告说,服用过量的维生素可能会对健康造成损害。下列说法正确的是( ) A.普通百姓观点的合理性在于,看到了量变是质变的必要准备 https://www.xmerzhong.cn/jxjy/djyz/zzz/202008/t20200818_27807.htm
10.《艺术概论》陈岸瑛笔记大纲及课后思考题(艺术概论)书评对艺术家留下的言论进行研究有助于理解艺术家创作意图,有利于艺术史的研究。4. 你知道哪些知名艺术批评家?他们的主要观点是什么?格林伯格,不是很了解他的主要观点。5. 艺术批评的功能与作用是什么?艺术批评与艺术行业具有紧密联系,对于艺术品的价格具有举足轻重的作用。艺术批评不仅与实物性的活动有着紧密的联系,https://book.douban.com/review/14837209/
11.盘点试管婴儿移植胚胎胶的三大作用,理解为“胶水”通俗易懂EmbryoGlue(玻尿酸添加培养液)就是所谓的胚胎胶,胚胎胶可以起到类似“胶水”的作用,就有帮助胚胎着床、防止宫外孕的作用,而且有研究表明,移植使用胚胎胶还提高了一定的活产率和降低流产率,并且使用胚胎胶也是安全的,所以目前很多生殖中心都会使用“胚胎胶”以期提高胚胎的着床率和最终的活产率。 https://www.ishanin.com/article/508bd43f692cd610e876.html
12.保健食品消费指导(连载三)消费维权篇(二)明示或暗示治疗作用的词语。 (三)人名、地名、汉语拼音。 (四)字母及数字,维生素及国家另有规定的含字母及数字的原料除外。 (五)除“”之外的符号。 (六)消费者不易理解的词语及地方方言。 (七)庸俗或带有封建迷信色彩的词语。 (八)人体组织器官等词语,批准的功能名称中涉及人体组织器官等词语的除外。 https://www.shhk.gov.cn/xwzx/002008/002008006/002008006006/20160308/1dba9729-9e90-462d-bfb0-0671d965bd7d.html
13.礼仪的基本知识4、礼仪有哪些功能和作用? 答:沟通的功能,人们在社会交往中,只要双方都自觉地遵守礼仪规范,就容易沟通感情,从而使交际往来容易成功协调的功能,在社会交往时,只要人们注重礼仪规范,就能够互相尊重,友好合作,从而缓和或避免不必要的冲突和障碍。维护的功能,礼仪是社会文明发展程度的反映和标志,同时也对社会的风尚产生广泛https://www.ruiwen.com/liyichangshi/6517797.html
14.浅谈C#字段和属性C#教程2.通俗的理解: 私有化:字段就好比我们的个人财产,仅供个人使用,所以一般是private修饰。 添加标准:根据程序的功能需求,具体来添加需要的不同类型的字段。 三、属性 1.属性的使用 作用:在面向对象设计中主要使用属性描述对象的静态特征。 要求:一般采用Pascal命名法(首字母大写),数据类型要和对应的字段要一致。 https://www.jb51.net/article/189590.htm
15.一篇带你了解GPL前世今生修改自由:允许开发人员增加或删除软件的功能,但必须依然基于GPL许可协议授权。 4. 通俗的讲下GPL到底有什么作用? 总结成一句话,修改后必须以GPL授权开源发布。 只要在代码中加入这个名叫GPL的许可证,你就能保证软件的用户能够自由地运行、研究、分享和修改你的代码了。 https://www.51cto.com/article/695392.html
16.教育教学成果及效果总结(精选35篇)教学设计控制着教学节奏、教学方向、教学过程、决定着教学目标的实现,教师在教学中起主导作用。今天小编给大家为您整理了教育教学成果及效果总结,希望对大家有所帮助。 教育教学成果及效果总结 1 一、继续撰写周教学反思 按照20xx年我校制定的“课堂教学效率年”三年实施方案的相关要求,继续将选题指南中的六号题目“《https://www.oh100.com/kaoshi/jiaoxuezongjie/502889.html