位置: 编程技术 - 正文

javascript作用域和闭包使用详解(javascript 作用域)

编辑:rootadmin

作用域的嵌套将形成作用域链,函数的嵌套将形成闭包。闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一。

作用域JavaScript 中有两种作用域:函数作用域和全局作用域。

在一个函数中声明的变量以及该函数的参数享有同一个作用域,即函数作用域。一个简单的函数作用域的例子:

不同于C等其它有块作用域的语言,这里将始终返回 2 。

全局作用域,对于浏览器来说可以理解为 window 对象(Node.js则是 global):

对于变量 bar 和函数 foo 都属于全局作用域,都是 window 的一个属性。

作用域链在 JavaScript 中访问一个变量时,将从本地变量和参数开始,逐级向上遍历作用域直到全局作用域。

在最里层的函数中,各个变量都能被逐级遍历并输出。而倒数第二层的函数中,变量 three 无法遍历找到,所以输出了 undefined 。

举一个通俗点的例子,你准备要花钱买点东西时,会先摸摸自己的钱包,没了你可以找你爸要,你爸也没有就再找你爷爷,... 。而你爸没钱买东西时,他并不会来找你要。

闭包在一个函数中,定义另一个函数,称为函数嵌套。函数的嵌套将形成一个闭包。

闭包与作用域链相辅相成,函数的嵌套在产生了链式关系的多个作用域的同时,也形成了一个闭包。

那么怎么理解闭包呢?

外部函数不能访问内嵌函数外部函数也不能访问内嵌函数的参数和变量而内嵌函数可以访问外部函数的参数和变量换一个说法:内嵌函数包含了外部函数的作用域我们再看看之前讲述的作用域链的例子,这次从闭包的角度来理解下:

最里层的函数能访问到其内部和外部定义的所有变量。而倒数第二层的函数无法访问到最里层的变量,同时,最里层的 scope = 3 这个赋值操作并没有对其外部的同名变量产生影响。

再换个角度来理解闭包:

每次外部函数的调用,内嵌函数都会被创建一次在它被创建时,外部函数的作用域(包括任何本地变量、参数等上下文), 会成为每个内嵌函数对象的内部状态的一部分,即使在外部函数执行完并退出后看下面的例子:

我们将得到两次 "2" ,而不是预期的 "1" 和 "2" ,这是因为在 list 中的两个函数访问的变量 i 都是其上一层作用域的同一个变量。

我们改动下代码,以利用闭包来解决这个问题:

外层的“立即执行函数”接收了一个参数变量 i ,在其函数内以参数 j 的形式存在,它与被返回的内层函数中的名称 j 指向同一个引用。外层函数执行并退出后,参数 j (此时它的值为 i 的当前值)成为了其内层函数的状态的一部分被保存了下来。

推荐整理分享javascript作用域和闭包使用详解(javascript 作用域),希望有所帮助,仅作参考,欢迎阅读内容。

javascript作用域和闭包使用详解(javascript 作用域)

文章相关热门搜索词:js作用域链是什么,js有哪些作用域,分别是什么意思,javascript作用域有几种,js作用域和作用域链的理解阮一峰,javascript作用域和闭包,js作用域与作用域链,javascript作用域和闭包,javascript作用域链,内容如对您有帮助,希望把文章链接给更多的朋友!

javascript实现存储hmtl字符串示例 Function.prototype.heredoc=function(){//利用function的注释来存储字符串,而且无需转义。var_str=this.toString(),s_pos=_str.indexOf("/*")+2,e_pos=_str.lastIndexOf("*/");return(s_pos0||

对js关键字命名的疑问介绍 js对关键字命名我感觉有点乱有时候是这样:getElementById、indexOf、charCodeAt、parseFloat、navigator.appName、navigator.appVersion/appCodeName/cookieEnable/userAgent给人的感

js对象内部访问this修饰的成员函数示例 用wrapper封装这样在对象内外都可以访问functionMapPool(){functioncreateMarker(name,lat,lng,state){varmarker=newAMap.Marker({position:newAMap.LngLat(lng,lat),});//thefunctionmapMoveToisnot

标签: javascript 作用域

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

上一篇:js检测浏览器版本、核心、是否移动端示例(js查看浏览器信息)

下一篇:javascript实现存储hmtl字符串示例(js存储)

  • 农民收购农产品发票
  • 应交税费的借贷方向
  • 其他债权投资是资产还是负债
  • 当期可抵扣进项税额加计5%抵减应纳税额
  • 定期定额不开票违法吗
  • 其他应收款收到发票怎么写会计分录
  • 成本费用总额占营业收入比重
  • 对公的etc怎么绑定怎么充值
  • 抄报税校验失败调用系统服务出错怎么办
  • 在企业所得税中增值税可以扣除吗
  • 预收款未开票账务处理
  • 记账凭证摘要的重要性
  • 购入农产品的增值税率
  • 被强制执行的款怎么记账
  • 单位捐赠汽车账务处理要如何做?
  • 固定资产的入账价值怎么计算
  • 增值税附加税减半征收政策
  • 2017年金税盘服务费已全额减免,勾选系统怎么处理
  • 房地产开发企业资质等级有几个
  • 医疗收费票据可以补打吗
  • 小微企业季度销售额超过30万增值税
  • 我的初级奋斗经历作文
  • 已知不含税金额和增值税如何计算税率
  • 高新企业研发项目
  • 设备采购计入什么科目
  • 注册中的商标转让
  • 笔记本电脑设置pin是什么意思
  • 内存坏了电脑会黑屏吗
  • 暗格里的秘密电视剧彩蛋百度网盘
  • 商品售价有规定吗
  • 腾讯电脑管家中蓝牙在哪
  • php实现上传图片到数据库
  • 公司收到个人入股股金,然后又投资其他公司怎么做账
  • dae是什么文件
  • php使用memcache
  • 企业所得税季度预缴是什么意思
  • 代缴房产税代缴的人要负责吗
  • 报销差旅费退回现金会计分录
  • 注意力机制cbam
  • php下载文件到指定目录
  • 独立核算的分公司注销时账面怎么处理
  • 子公司分公司和办事处账务上的区别有哪些
  • 文明手语动作
  • 全年累计个税扣除公式
  • java一维数组从小到大排序
  • 进项未认证但已开票怎么办
  • 电子缴款凭证在哪里找
  • 股本金如何归还股东
  • 全资子公司注销的账务处理
  • 有销项没有进项怎么做分录
  • 定期定额个体工商户怎么报税
  • 固定资产3%减按2%征收增值税申报表如何填写
  • 企业转让固定资产属于什么收入
  • 预收账款结转收入分录
  • 用友u8怎样查询上个月凭证
  • 无追保理是投资理财吗
  • 支付残疾人保证金的现金流
  • 采购费用属于什么会计分录
  • 购入固定资产一次性扣除政策
  • 五证合一的办理流程是什么
  • sql储存过程
  • microsoft window vista
  • mac在哪设置
  • win7怎么禁止系统自动更新
  • windows运行不了怎么办
  • win10阻止可能不需要的应用吗
  • win732位系统怎么装
  • vmware centos8
  • win10系统版本20h2
  • win10无法回退到以前的版本怎么办
  • 升级win10系统后鼠标键盘无法用什么原因
  • Bootstrap与KnockoutJs相结合实现分页效果实例详解
  • angular.js
  • Ver、Vol、Ctty命令的使用教程
  • jQuery prototype冲突的2种解决方法(附demo示例下载)
  • android 属性动画改变view大小
  • 广东民生求助热线电话是多少
  • 国家医保平台查不到住院记录
  • 缴款单号怎么交学费
  • 车辆购置税是国家收还是地方收
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设