位置: 编程技术 - 正文

JavaScript高级程序设计(第3版)学习笔记9 js函数(下)(javascript高级程序设计第五版 pdf下载)

编辑:rootadmin
再接着看函数——具有魔幻色彩的对象。 9、作为值的函数   在一般的编程语言中,如果要将函数作为值来使用,需要使用类似函数指针或者代理的方式来实现,但是在ECMAScript中,函数是一种对象,拥有一般对象具有的所有特征,除了函数可以有自己的属性和方法外,还可以做为一个引用类型的值去使用,实际上我们前面的例子中已经有过将函数作为一个对象属性的值,又比如函数也可以作为另一个函数的参数或者返回值,异步处理中的回调函数就是一个典型的用法。 再看一个使用函数作为返回值的典型例子,这个例子出自于原书第5章: 、闭包(Closure)   闭包是指有权访问另一个函数作用域中的变量的函数。对象是带函数的数据,而闭包是带数据的函数。   首先闭包是一个函数,然后闭包是一个带有数据的函数,那么,带有的是什么数据呢?我们往上看看函数作为返回值的例子,返回的是一个匿名函数,而随着这个匿名函数被返回,外层的createComparisonFunction()函数代码也就执行完成,按照前面的结论,外层函数的执行环境会被弹出栈并销毁,但是接下来的排序中可以看到在返回的匿名函数中依旧可以访问处于createComparisonFunction()作用域中的propertyName,这说明尽管createComparisonFunction()对应的执行环境已经被销毁,但是这个执行环境相对应的活动对象并没有被销毁,而是作为返回的匿名函数的作用域链中的一个对象了,换句话说,返回的匿名函数构成的闭包带有的数据就是:外层函数相应的活动对象。由于活动对象的属性(也就是外层函数中定义的变量、函数和形式参数)会随着外层函数的代码执行而变化,因此最终返回的匿名函数构成的闭包带有的数据是外层函数代码执行完成之后的活动对象,也就是最终状态。   希望好好理解一下上面这段话,反复理解一下。虽然我已经尽我所能描述的更易于理解一些,但是闭包的概念还是有些抽象,下面看一个例子,这个例子来自原书第7章: 这里由于闭包带有的数据是createFunctions相应的活动对象的最终状态,而在createFunctions()代码执行完成之后,活动对象的属性i已经变成,因此在下面的调用中每一个返回的函数都输出了,要处理这种问题,可以采用匿名函数作用域来保存状态: 将每一个状态都使用一个立即调用的匿名函数来保存(保存在匿名函数相应的活动对象中),然后在最终返回的函数被调用时,就可以通过闭包带有的数据(相应的匿名函数活动对象中的数据)来正确访问了,输出结果变成0,1,...9。当然,这样做,就创建了个闭包,在性能上会有较大影响,因此建议不要滥用闭包,另外,由于闭包会保存其它执行环境的活动对象作为自身作用域链中的一环,这也可能会造成内存泄露。尽管闭包存在效率和内存的隐患,但是闭包的功能是在太强大,下面就来看看闭包的应用——首先让我们回到昨天所说的函数绑定方法bind()。 (1)函数绑定与柯里化(currying) A、再看this,先看一个例子(原书第章): 如果你去点击“Hello”按钮,控制台打印的是什么呢?竟然是Button,而不是期望中的Event,原因就是这里在点击按钮的时候,处理函数内部属性this指向了按钮对象。可以使用闭包来解决这个问题: B、上面的解决方案并不优雅,在ES5中新增了函数绑定方法bind(),我们使用这个方法来改写一下: 这里添加的bind()方法中,主要技术也是创建一个闭包,保存绑定时的参数作为函数实际调用时的内部属性this。如果你不确定是浏览器本身就支持bind()还是我们这里的bind()起了作用,你可以把特性检测的条件判断去掉,然后换个方法名称试试。 C、上面对函数使用bind()方法时,只使用了第一个参数,如果调用bind()时传入多个参数并且将第2个参数开始作为函数实际调用时的参数,那我们就可以给函数绑定默认参数了。 D、柯里化:在上面绑定时,第一个参数都是用来设置函数调用时的内部属性this,如果把所有绑定时的参数都作为预填的参数,则称之为函数柯里化。 (2)利用闭包缓存   还记得前面使用递归实现斐波那契数列的函数吗?使用闭包缓存来改写一下: 下面是测试代码以及我机器上的运行结果: 可以看到,n值越大,使用缓存计算的优势越明显。作为练习,你可以尝试自己修改一下计算阶乘的函数。 (3)模仿块级作用域   在ECMAScript中,有语句块,但是却没有相应的块级作用域,但我们可以使用闭包来模仿块级作用域,一般格式为: 上面这种模式也称为立即调用的函数表达式,这种模式已经非常流行了,特别是由于jQuery源码使用这种方式而大规模普及起来。   闭包还有很多有趣的应用,比如模仿私有变量和私有函数、模块模式等,这里先不讨论了,在深入理解对象之后再看这些内容。   关于函数,就先说这些,在网上也有很多非常棒的文章,有兴趣的可以自己搜索一下阅读。这里推荐一篇文章,《JavaScript高级程序设计(第3版)》译者的一篇译文:命名函数表达式探秘。

推荐整理分享JavaScript高级程序设计(第3版)学习笔记9 js函数(下)(javascript高级程序设计第五版 pdf下载),希望有所帮助,仅作参考,欢迎阅读内容。

JavaScript高级程序设计(第3版)学习笔记9 js函数(下)(javascript高级程序设计第五版 pdf下载)

文章相关热门搜索词:javascript高级程序设计最新版,javascript高级程序设计pdf百度云,javaScript高级程序设计,javascript高级程序设计第五版 pdf下载,javascript高级程序设计pdf百度云,javaScript高级程序设计有几版,javascript高级程序设计第六版,javascript高级程序设计第六版,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript高级程序设计(第3版)学习笔记 再访js对象 1、对象再认识(1)对象属性和特性什么是属性(Property),什么是特性(Attribute),这有什么区别?我不想也不会从语义学上去区分,对于这系列文章

JavaScript高级程序设计(第3版)学习笔记 内建js对象 内建对象就好比是JDK中的类库,开发者可以直接拿来使用,这极大的方便了常见的编程任务。这篇文章就来浏览一下主要的内建对象,当然,我们并不

JavaScript高级程序设计(第3版)学习笔记 js正则表达式 需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了

标签: javascript高级程序设计第五版 pdf下载

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

上一篇:JavaScript高级程序设计(第3版)学习笔记8 js函数(中)(javascript高级程序设计最新版)

下一篇:JavaScript高级程序设计(第3版)学习笔记10 再访js对象(javascript高级程序设计第三版)

  • 查账征收纳税申报表
  • 固定资产清理过程涉及的报表
  • 先付款后签合同 法律效力
  • 固定资产二级科目取消原因
  • 红字信息表撤销失败B80095
  • 增值税税控服务费的账务处理
  • 塑料制品的商品编码是什么类发票
  • 小企业会计准则以前年度损益调整
  • 购买工程款计入什么科目
  • 工人受伤医药费计入什么科目
  • 公司租的员工宿舍退租,现在要开发票给人家退房租
  • 滴滴 增值税
  • 运输行业税负率一般控制在多少?
  • 交上月增值税的凭证
  • 特许权使用费收入确认分录
  • 关于固定资产管理
  • 个人部分公积金可以抵扣个税吗
  • 一般纳税人申报哪些税种
  • 印花税减免税额需要做账吗
  • 卖房的税种
  • 补缴的附加税怎么入账
  • 购买工程资质文件怎么写
  • 资产负债表与现金流量表的关系
  • 华硕笔记本预装win10改装win7,有图文教程
  • 如何删除系统自带的软件
  • 股东分红怎么处理
  • 职工食堂的费用,会计上怎么做账?
  • 如何理解应交税费未交增值税
  • 民办非企业的注册资金最低限额
  • 房地产企业预售房产怎么缴税
  • 车保险理赔的钱多久到账
  • STP详解
  • 在校学生是不是纳税人,请举例说明
  • php数组的概念是什么
  • 定额材料损耗的计算公式
  • php javascript
  • 开源项目网站
  • vue如何实现登录
  • vue-router导航守卫
  • 合并会计报表的编制
  • 帝国cms修改提示怎么设置
  • 织梦内容页模板修改
  • 织梦的首页怎么换图片
  • 资产管理业务是表外业务吗
  • 银行代发工资必须是本行的卡吗
  • mysql存储语句
  • 财产租赁合同印花税双方都要交吗
  • 利润表的税金及附加怎么得出来
  • 广告费的税额计入哪里
  • 没有收到房租发票
  • 开发成本存货怎么算
  • 房地产公司房屋租赁管理办法
  • 银行保函会计处理
  • 代金券消费怎么入账
  • 磅差怎么开票
  • 留存收益资本成本公式
  • 汇算清缴产生的企业所得税如何做账
  • 回收锯末木屑价格
  • 混合销售行为征收增值税
  • 存货跌价准备怎么结转成本
  • sql Server 触发器的when的用法
  • sqlserver存储过程返回多个结果集
  • Win10系统如何利用360压缩软件解决打不开RAR压缩包的问题
  • windows 10各版本
  • 怎么把喜欢的图片设置成电脑壁纸
  • win8 开机后无法进入系统
  • win10非正常关机系统修复
  • react service worker
  • node session
  • 深入理解新发展理念,推进供给侧结构性改革
  • android之Java+html+javascript混合开发
  • jquerychange事件
  • python用什么编辑
  • 开票资料?
  • 公司税务电子发票怎么开
  • 国家税务局浙江省电子税务局新版
  • 如何查询车辆购买的保险
  • 欧美 房产税
  • 重庆两江新区总工会社会化工作者待遇
  • 国外寄回来的奶粉被海关查到剪开,快递公司怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设