作用域 作用域链 闭包 思想 JS/C++比较
首先,我说的比较是指JS中这种思想/实现方式与C++编译原理中思想/实现方式的比较
参考链接:(比较易懂的介绍,我主要写个人理解)
作用域链: http://www.cnblogs.com/dolphinX/p/3280876.html
闭包:http://kb.cnblogs.com/page/110782/
个人理解:
作用域链:
- 在JS中,function也是一种object的实例。
- 作用域的概念必须已经知晓。
- 作用域链:用于标识符解析:确定数据的存储位置以及数据作用域(数据访问)。(应该可以扩展)
- 函数执行时会创建“运行期上下文”的内部对象,当函数执行完毕后被销毁(与闭包性能有关)
- C++等应该不存在这类问题。因为C++函数内不能定义函数(除了lambda外),而函数调用则会在调用完后局部变量自动释放
- scope chain代表引用链,使用的时function对象中内置的scope属性,
- scope chain采用倒排索引,局部靠前,且数据访问从索引链中依次访问(性能提升点!!)
- 所以,局部变量会覆盖全局变量/外层变量,由此可知原因。
- 类比编译原理,在汇编语言中,子函数要访问外层变量,使用的。。方法也与此思想相似,
- 猜测:数据的存储与访问是编程语言的共同问题,而作用域链是解决这种问题的一种思想。而且,这有验证了一件事:程序逻辑和数据管理真的是编程语言的精髓!
闭包:理解作用域链之后,闭包就容易理解多了。
- 闭包概念:要执行的代码块(包含自由变量) + 为自由变量提供绑定的计算环境(作用域)。
- 闭包表现:function parent(){ var a; function child(){return ++a;} }
- 其实闭包就是调用function对象的funtion属性(只是这属性也是对象而已)的一种特殊情况
- 通常情况:如果 child不需要访问外层变量,则函数执行完毕后被销毁(作用域结束)
- 特殊情况(闭包):如果child需要访问外层变量,则外层函数执行完后,由于child函数对其存在引用,外层函数激活对象无法被销毁,导致内存开销增增加,而且外层变量的引用在scope chain中的位置也会影响数据访问的性能。
- 虽然闭包有各种问题,但是访问外层变量却是很有必要的操作。
- 参考这个函数:pushAny函数返回值是函数,即longLiveSeniorFunc是函数,而且保留了plusAny函数(外层函数)的变量senior不被释放。
1 function plusAny(senior) {
2 return function(second) {
3 return senior + second;
4 }
5 }
6
7 /* usage */
8
9 var senior = 2838240000;
10 var longLiveSeniorFunc = plusAny(senior);
11
12 longLiveSeniorFunc(1); // +1s
13 longLiveSeniorFunc(3600); // +1h
14 longLiveSeniorFunc(86400); // +1d
15
16 作者:张玳
17 链接:https://www.zhihu.com/question/51402215/answer/125701810
18 来源:知乎
19 著作权归作者所有,转载请联系作者获得授权。
作用域 作用域链 闭包 思想 JS/C++比较的更多相关文章
- js原型链闭包作用域链-Tom
1.原型相当于Java.C++里面的父类,由封装公有属性及方法而产生,子类可以继承. 原型继承实现(函数的原型属性指向原型函数一个实例对象,函数的原型的构造函数指向函数本身) 1)eg:原型链 fun ...
- 聊一下JS中的作用域scope和闭包closure
聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...
- JavaScript之作用域-作用域链
作用域 ==> 作用域链 作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ...
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
- [js]js代码执行顺序/全局&私有变量/作用域链/闭包
js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...
- JavaScript this 局部变量全局变量 作用域 作用域链 闭包
从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object" ...
- 作用域&作用域链和with,catch语句&闭包
作用域(函数) 作用域:变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期; 在一些类C编程语言中花括号内的每一段代码都有各自的作用域,而且变量在声明它们的代码段外是不可见的,称之为块 ...
- 作用域,作用域链,垃圾收集,js解析
变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象. 引用类型可以为其添加属性和方法,也可以改变和删除属性和方法. 复制变量值: 基本类型:一个变量向另一 ...
- Js作用域&作用域链
js构建类 一 构建类的原则 构造函数 等于 原型的constructor //构造函数 function Hero(name,skill){ this.name = name; this.skill ...
随机推荐
- 微信小程序对接显示阿里云数据库数据
现实需求 在项目中需求,有时候现场设备发生故障,需要远程的人员知道.除了邮件方式,以微信小程序的方式也很好.今天进行尝试,并制作了一个demo版本. 1.微信小程序申请制作前端 1.1lists文件( ...
- a = input(a, yymmdd10.)引发的问题
在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式. 首先准备数据集: data data1; input a :$10. b :$10. ...
- Drupal 远程代码执行漏洞(CVE-2019-6339)
影响版本 Drupal core 7.62之前的7.x版本.8.6.6之前的8.6.x版本和8.5.9之前的8.5.x版本 poc https://github.com/thezdi/PoC/blob ...
- 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)
这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...
- 比@EnableMongoAuditing功能强大的实现
问题出现 以前通过@EnableMongoAuditing.@CreateDate.@LastModifiedDate进行实体类创建时间.修改时间的自动管理. 但为了实现多数据源的管理以及切换,自己覆 ...
- JAVAWEB - Servlet原理及其使用>从零开始学JAVA系列
目录 Servlet原理及其使用 什么是Servlet Servlet的使用 编写一个Servlet,使用继承HttpServlet的方式 配置web.xml 很简单的几个JSP文件 小提示,如果继承 ...
- Mantis安装过程笔记
安装平台:Windows Server 2003 R2 Enterprise x64 Edition 软件: EasyPHP-5.3.6.1 mantisbt-1.2.6 安装过程: 首先安装Easy ...
- SpringBoot开发五-社区首页开发
需求介绍-社区首页 根据之前的学习,我们一般都是先按照DAO->Service->Controller这个顺序去开发 分布实现: 开发社区首页,显示前十个帖子. 开发分页组件,分页显示所有 ...
- idea 2019.3.3 系列产品破解
所有软件版本要求 必须是2019.3.3版本,可破解idea, goland, datagrid, pycharm等系列产品. 编辑vmoptions 添加破解jar包 然后重新打开,输入激活码进行激 ...
- 006 媒体独立接口(MII,Meida Independent Interface)
一.MII接口 MII接口Medium Independent Interface MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准 ...