作用域 作用域链 闭包 思想 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 ...
随机推荐
- 谈谈 C++ STL 中的迭代器
C++中的迭代器和指针 在前面的内容中我们简单讲过,STL主要是由三部分组成 容器(container),包括vector,list,set,map等 泛型算法(generic algorithm), ...
- Mybatis学习笔记-Mybatis简介
如何获得Mybatis 中文文档 https://github.com/tuguangquan/mybatis Github https://github.com/mybatis/mybatis-3 ...
- C++ //构造函数调用规则 //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) //析构函数(空实现) //拷贝函数(值拷贝) //2.如果我们写了有参构造函数 编译器就不会提供默认构造函数 但是会提供拷贝构造函数 //3.如果我们写了拷贝函数 编译器就不再提供 默认 有参 构造函数
//构造函数调用规则 #include <iostream> using namespace std; //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) ...
- JAVA基础语法:常用功能符以及循环结构和分支结构(转载)
3.JAVA基础语法:常用功能符以及循环结构和分支结构 1.常用功能符 注释 ("文字"是被注释的部分) //文字 单行注释 /文字/ 多行注释 算术运算符 + - * / / 整 ...
- k8s之数据存储-高级存储
PV和PVC 前面已经学习了使用NFS提供存储,此时就会要求用户会搭建NFS系统,并且会在yaml配置nf's,由于k8s支持的存储系统有很多,要求客户全部掌握,显然不现实.为了能够屏蔽底层存储实现的 ...
- springboot中@Mapper和@Repository的区别
@Mapper和@Repository是常用的两个注解,两者都是用在dao上,两者功能差不多,容易混淆,有必要清楚其细微区别: 区别: @Repository需要在Spring中配置扫描地址,然后生成 ...
- 【转】ps命令详解与使用
ps 概述 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态 ...
- 二:Servlet简介
一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是 ...
- 【SOE】 ArcGIS Server对象扩展(SOE)开发注意事项
ArcGIS Server对象扩展(SOE)开发注意事项 1.SOE介绍 在ArcGIS 10.1中ArcGIS Server不在支持DCOM方式的连接,这也就意味着我们不能通过本地方式的连接使用A ...
- JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...