作用域 作用域链 闭包 思想 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 ...
随机推荐
- 题解 P6688 可重集
己所欲者,杀而夺之,亦同天赐 解题思路 一定不要用自动溢出的 Hash!!!!!!! 我真的是调吐了... 思路非常简单明了 : 需要我们创新一下 Hash. 首先我们的 Hash 要满足无序性.. ...
- scrapy 错误:Missing scheme in request url: %s' % self._url
先说报错原因:使用了和start_urls同名的参数 我通过scral crawl projename -a start_urls=http:example.com来传start_urls,然后想在项 ...
- vue传值 ---- >> 子传父,$emit()
划重点: $emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数. 子组件: 1 <template& ...
- Spring boot无法显示jsp页面问题汇总
问题1: o.s.w.s.r.ResourceHttpRequestHandler:Path with "WEB-INF" or "META-INF": [WE ...
- [TensorFlow2.0]-张量与常用函数
本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...
- 免费个人图床搭建gitee+PicGo
我们写博客的时候经常会需要配图,特别是markdown写的时候只能通过网络链接来展示图片. 首先来说存储仓库.测试过几款存储图片的仓库,最终选择方案3: 1.阿里OSS需要付费,空间和流量双向收费,对 ...
- repeatedly function in Clojure
user=> (doc repeatedly) clojure.core/repeatedly ([f] [n f]) Takes a function of no args, presumab ...
- FIFO 深度了解
嘻哈第二篇,深度聊聊各种细节. 优化与跨时钟阈分析
- STM32—中断详解(配合按键中断代码,代码亲测)
在STM32中执行中断主要分三部分: 1.配置NVIC_Config()函数 2.配置EXTI_Config()函数 3.编写中断服务函数 (注:本文章所用代码为中断按键代码,实现了按键进入中断从而控 ...
- 一文搞懂Java/Spring/Dubbo框架中的SPI机制
几天前和一位前辈聊起了Spring技术,大佬突然说了SPI,作为一个熟练使用Spring的民工,心中一紧,咱也不敢说不懂,而是在聊完之后赶紧打开了浏览器,开始的学习之路,所以也就有了这篇文章.废话不多 ...