js之作用域链到闭包
一、作用域
全局作用域和函数作用域(局部作用域)。
一个变量的作用域就是源代码中定义这个变量的区域。
二、作用域链和闭包
全局变量只有一个(window,globel),全局环境下每一个函数都会形成一个局部作用域。而 “函数的嵌套会形成一个个局部作用域嵌套着其余他一个个局部作用域”。这种 嵌套关系就是我理解的作用域链;
基于词法作用域的规则,函数定义 时的作用域链到函数执行的时候依然有效。
所以越嵌套到局部作用域中 的局部作用域中变量,需要从自身作用域开始,寻找变量的申明,如果没有,会顺着局部作用域嵌套一直找到全局作用域。特殊情况,一个在局部作用域中没有定义 ,直接赋值的变量,如果在作用域连上的局部作用域中也没有申明,会直接在全局下申明一个全局变量,并在赋值语句的地方进行赋值。
我们把作用域链描述成一个对象列表 ,不是绑定的栈;
每次函数调用的时候,都会为之创建一个新的对象AO(active object),把找个对象加到作用域链中(对象 列表)。当函数返回时(执行完毕),就从作用域链中将其删除。
如果这个函数中还嵌套着另一个函数a,那么a也会生成一个对象AO,并且 a得作用域链会指向这个a的AO对象 ,当函数返回时,会在a外部局部作用域中保存下来,那么他们 也会跟外部作用域的AO一起删除,当作垃圾回收。
如果将这个函数的作为 返回值返回或者存储在某处 的属性中,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当作垃圾回收。
三、代码逻辑图
function a(){
}
function b(){
function c(){}
c()
}
a () ==>作用域类 [] ==> a的ao
全局window的GO
b () ==>作用域类 [] ==> b的ao
全局window的GO
执行到c()==>作用域类 [] ==> c的ao
b的ao//从这里开始来自b
全局window的GO
类似如上述逻辑代码,一个函数在全局下,他会在申明自己的AO执行上下文,然后把处于的位置的执行上下文加入到自己的队列中,形成一个类似数组的结构,我需要一个变量(方法),首先在自己的上下文中找,找不到,找我在处在的这个上下文,还找不到就继续往上找,一直找到window.
所以类似的,每个函数都有这个执行上文然后加上自己所处的执行上下文组成的自己的作用域链.
采用迭代 一直迭代到window结束这个作用域链的层层迭代.
js之作用域链到闭包的更多相关文章
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- js深入(三)作用域链与闭包
在之前我们根绝对象的原型说过了js的原型链,那么同样的js 万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链 作用域链 首先先来回顾一下之前讲到的原型链的寻找机制,就是实例会先从本身开 ...
- JS详细图解作用域链与闭包
JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...
- 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This
参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...
- 前端高质量知识(四)-JS详细图解作用域链与闭包
攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法 ...
- 在chrome开发者工具中观察函数调用栈、作用域链与闭包
在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...
- js中作用域链的问题
为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...
- 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
在前端开发中,有一个非常重要的技能,叫做断点调试. 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象, ...
随机推荐
- MVC Views文件夹下js无法访问问题解决方案
出现这个问题是因为webconfig做的限制,可修改相应Views下的webconfig文件来解决. <system.webServer> <handlers> <rem ...
- 未能执行URL
在 <compilation debug="true"> 下 加入: <buildProviders> <add extension=".h ...
- PHP----------一群猴子排成一圈,按1,2,...,n依次编号。
1.一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去, 直到最后只剩下一只猴子为止,那 ...
- asyncio之Coroutines,Tasks and Future
asyncio之Coroutines,Tasks and Future Coroutines and Tasks属于High-level APIs,也就是高级层的api. 本节概述用于协程和任务的高级 ...
- SSM框架和SSH框架的区别
SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...
- 已有的PHP安装gd扩展
第一步 安装依赖 1.安装xpm yum install libXpm-devel 2.安装zlib wget http://zlib.net/zlib-1.2.8.tar.gz tar -xzvf ...
- Idea导包与打包
今天做了一个javavuser协议的性能测试,需要导入jar包,将jar包粘贴到lib下面后不知道怎么加到工程当中, 1,下面分享一下有关导包的流程: 先是在jar 右键,如图 : 选择项目结构,选择 ...
- turtle画王思聪吃热狗(杨艳春,何金凝小组)
点击此处查看视频:http://v.douyin.com/RCY8GD/import turtle as t t.setup(450,300) t.pensize(4) t.color('black' ...
- 日常开发工作常用linux命令
:wq 保存退出 :q! 强制退出 vi 查看 vim 编辑 rpm -qa|grep jdk 命令查看当前的jdk情况 yum -y remove java java-1.7.0-openjdk* ...
- laravel composer
composer config -g repo.packagist composer https://packagist.phpcomposer.com 改安装包的全局镜像网址