位置: 编程技术 - 正文

JavaScript基础篇(6)之函数表达式闭包(javascript入门基础)

编辑:rootadmin

推荐整理分享JavaScript基础篇(6)之函数表达式闭包(javascript入门基础),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript零基础,javascript基础入门教程,javascript零基础,javascript零基础,javascript 基础,javascript教程chm,javascript基础编程,javascript基础入门视频教程,内容如对您有帮助,希望把文章链接给更多的朋友!

其实js支持函数闭包的主要原因是因为js需要函数能够保存数据。这里的保存数据是只函数在运行结束以后函数内变量的值也会进行保存。至于为什么js需要在函数内可以保存数据,那就是js是一种函数式语言。在函数内保存数据是函数式语言的一大特征。

回顾前面介绍过的三种定义函数方式

functiosu(numnumreturnunum//函数声明语法定义vasufunction(numnum)returnunum}//函数表达式定义vasuneFunction("num""num""returnunum")//Functio构造函数

在分析闭包之前我们先来看看,定义和调用函数容易犯的错误。

例1:

例2:

例3:

在例1中,我们不能在使用函数声明式语法定义之前调用函数。解决方案:

1.如果使用函数表达式定义函数的话,需要在表达式定义后调用。

2.使用函数声明式。(这里浏览器引擎会 函数声明提升, 在所有代码执行之前先读取函数声明)

在例2中,我们预期的结果应该是打印1,实际结果是打印2。

为什么会这样?正因为 函数声明提升 ,所以浏览器在预解析的时候不会判断if条件,直接解析第二个函数定义的时候覆盖了第一个。

解决方案:

在例3中,发现只能只用fun1()调用,而不能使用fun2()调用。

我自己的理解,真正原因不知道。没找到资料。

因为1: function fun3() { }; 等效与 var fun3 = function fun3() { }; 如图:

所以只能只用fun1()调用,而不能使用fun2()调用。

其实这里我还是有疑问的?哪位大神知道,望告知。

既然,fun2在外面不能调用为什么在函数内部能调用?虽然在debugger还是得不到fun1。

JavaScript基础篇(6)之函数表达式闭包(javascript入门基础)

好了,通过上面的三道题目热身。我们继续今天的主题“闭包”。

1.什么是闭包?

定义:就是有权访问另一个函数作用域的变量的函数

我们先从一个示例函数开始:

例1:

例2:

例3:

显然,滥用闭包会增大内存的使用。所以非特殊情况尽量不要使用闭包。如果用到了,记得手动设置空引用,内存才能被回收 f = null ;

图解:(不了解作用域链的同学请先看前面的文章 作用域和作用域链 )

2.什么是匿名函数? (仅仅只是解释这个概念)

如:(即,没有名字的函数)

关于对象中函数的返回值是匿名函数时,this的怪异现象

讲解之前,先清醒下头脑,不要越看越迷糊了。如果迷糊了,那就直接忽略下面的。

obj.fun2();//打印结果"李四"意料之中的。obj.fun3()();//因为这里返回的是一个函数,所以要再加一对()来调用。打印结果是"张三",意料之外。//真是百事不得其解啊,什么this指向了全局?我们前面讲过“ 哪个对象点出来的方法,this就是哪个对象 ”,那我们的 obj.fun3()() 打印的是“张三”也就是说this执行了全局作用域。

我们看看下面的示例也许就知道为什么了。

我们来分解下 obj.fun3()() 先是 obj.fun3() 返回一个匿名函数到了window作用域,然后接着调用this就指向了window了。( 感觉解释有点勉强,也不知道对不,暂时自己先是这么理解的 )

闭包形成的原因:内存释放问题

一般,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域,但闭包的情况是不一样的。

闭包的活动对象依然会保存在内存中,于是像上例中,函数调用返回后,变量i是属于活动对象里面的,就是说其栈区还没有释放,但你调用c()的时候i变量保存的作用域链从b()->a()->全局去寻找作用域var i声明所在,然后找到了var i=1;然后在闭包内++i;结果,最后输出的值就是2了;

以上所述是小编给大家分享的JavaScript基础篇(6)之函数表达式闭包,希望大家喜欢。

JavaScript匿名函数之模仿块级作用域 匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。函数的定义,首先简单介绍一下函

javascript性能优化之事件委托实例详解 本文实例分析了javascript性能优化之事件委托。分享给大家供大家参考,具体如下:为下面每个LI绑定一个click事件ulid="myLinks"liid="goSomewhere"Gosomewhere/liliid=

JavaScript文档碎片操作实例分析 本文实例分析了JavaScript文档碎片操作方法。分享给大家供大家参考,具体如下:使用文档碎片在某些情况下可以提高页面效率。javascript操作dom是一个很

标签: javascript入门基础

本文链接地址:https://www.jiuchutong.com/biancheng/387194.html 转载请保留说明!

上一篇:Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)(express 前后端分离)

下一篇:JavaScript匿名函数之模仿块级作用域(javascript中的匿名函数)

  • 企业合并债权如何处理
  • 民非企业是否可以盈利
  • 甲是乙公司依法设立的分公司
  • 赠送客户的产品计入销售费用的二级科目
  • 房地产开发企业销售自行开发的房地产项目
  • 计入其他收益需要结转吗
  • 现金支出的一般程序
  • 房地产企业预售阶段企业所得税
  • 公允价值变动损益属于当期损益吗
  • 个人投资款怎么入账
  • 生产药酒的厂家
  • 含税和不含税哪个对卖方有利
  • 小规模纳税人进货需要发票吗
  • 增值税预征率记忆口诀
  • 土地增值税计算表
  • 年收入12万以内个人所得税
  • 外商投资企业税务优惠
  • 现金流量表附表的其他指的是什么
  • 外汇风险怎么规避
  • 结汇汇兑损益账务处理
  • 企业原材料盘盈的原因分析
  • 什么叫管理口径报表
  • 有哪些凭证
  • 餐饮费开专票
  • 资本性支出计算公式为什么加折旧
  • 免征增值税的会计处理方法有哪些
  • mac 的系统
  • 封装windows10
  • 企业扶贫有什么优惠政策
  • 企业亏损可以不缴纳公积金吗
  • 促销费影响主营利润吗
  • 残疾人保障金是强制性的吗
  • 公司赚的钱要交税吗?交多少?
  • php api
  • 发票已到货未到会计处理
  • win7安装高版本chrome
  • 非货币性资产交换
  • 用友预收货款账务处理
  • 华盛顿州帕卢斯心雕塑
  • php实现原理
  • 数据 挖掘
  • flask框架入门
  • php对象是什么类型的数据
  • 英文描述什么是利润表
  • 增值税专用发票上注明的价款含税吗
  • css的transition滑动效果
  • ❤️国庆假期快到了,用python写个倒计时程序,助你熬到假期!❤️
  • 预缴增值税款怎么入账
  • 国债收益率如何查看
  • sql server 2008使用
  • sql将一个表中的值赋给另一个表
  • 接受捐赠的增值税计入会计利润吗
  • 实收资本的账务处理与其他应收款
  • 民间非营利组织会计制度及操作实务
  • 会计分录如何分配利润
  • 向非关联企业捐赠现金
  • 土地管理费属于什么费用
  • 汽车配件属于什么业务类型
  • 老板买了手机,算入什么费用
  • 疫情期间购买消毒弥雾机的请示
  • 外购不动产用于办公
  • 电子设备按5年折旧可以吗?
  • 冲暂估成本怎么做分录
  • 其他应付款在借方是代表公司欠人家钱吗
  • 工会费上缴
  • 工业企业增值税税率
  • sql server 2000安装好打开不显示名称和服务原因
  • mysql数据库性能监控
  • windows dns server
  • WZCBDLS.EXE - WZCBDLS是什么进程
  • win8开机启动项怎么关闭
  • 内存运行linux
  • windows8怎么设置开机启动项
  • cocos2dx 教程
  • dos命令查看磁盘分区
  • java深入理解
  • python 钉钉打卡定位
  • Unity3D游戏开发(第2版)
  • 寻找志同道合的小伙伴
  • 划拨土地评估价
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设