一、作用域

  全局作用域和函数作用域(局部作用域)。

  一个变量的作用域就是源代码中定义这个变量的区域。

二、作用域链和闭包

  全局变量只有一个(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之作用域链到闭包的更多相关文章

  1. JS 之作用域链和闭包

    1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...

  2. 深入理解JS函数作用域链与闭包问题

    function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...

  3. js深入(三)作用域链与闭包

    在之前我们根绝对象的原型说过了js的原型链,那么同样的js 万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链 作用域链 首先先来回顾一下之前讲到的原型链的寻找机制,就是实例会先从本身开 ...

  4. JS详细图解作用域链与闭包

    JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...

  5. 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

    参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...

  6. 前端高质量知识(四)-JS详细图解作用域链与闭包

    攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法 ...

  7. 在chrome开发者工具中观察函数调用栈、作用域链与闭包

    在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...

  8. js中作用域链的问题

    为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...

  9. 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包

    在前端开发中,有一个非常重要的技能,叫做断点调试. 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象, ...

随机推荐

  1. Linux主机之间ssh免密登录配置方法

    由于公司的生产环境有很多台Linux的CentOS服务器, 为了方便机子(假设两台机子A,B)互相之间免密ssh, scp命令操作,配置如下 1. 在A.B上分别创建本机的公钥和私钥,输入命令后连续三 ...

  2. 【Mac】-NO.161.Mac.1 -【MacOS Error running 'Tomcat 8.5.371': Cannot run program Permission denied】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  3. 白话skynet第三篇:通过队列解决多线程竞争资源

    今天遇到一个问题,在大厅服务中,如果一个请求使用到了一个公共的变量,如何保证其一致性? 虽然请求是挨个运行的,但是skynet.call会阻塞. "同一个 skynet 服务中的一条消息处理 ...

  4. Cocos Creator 构建发布... APP ABI(选项)

    APP ABI 选项对应的是设备的 CPU 架构.勾选不同的值,编译出来的 apk 可以适用于不同的设备.勾选的越多,适配的机器越多.但是相应的 apk 包体越大. 需要根据自己的项目实际情况决定要编 ...

  5. 消息中间件解决方案JMS

    1. JMS入门 1.1消息中间件 1.1.1品优购系统模块调用关系分析 我们现在讲品优购已经完成的功能模块梳理如下: 我们已经完成了5个web模块和4个服务模块.其中运营商后台的调用关系最多,用到了 ...

  6. FG面经: Interval问题合集

    How to insert interval to an interval list. List is not sorted O(N) solution: package fb; import jav ...

  7. Mysql AVG() 值 返回NULL而非空结果集

    [1]select 查询返回一行NULL 先来模拟复现一下遇到的问题. (1)源数据表grades,学生成绩表 (2)查询SQL语句 查询‘080601’班的各门课平均成绩 SELECT sClass ...

  8. 按Enter登录,Esc退出

    回车登录,下图处,选择登录按钮的方法 下图是按ESC

  9. 字符串Contains匹配失效

    参考博客:https://blog.csdn.net/lewky_liu/article/details/79353151 在编码过程中发现一个很神奇的事情,使用String.contains方法失效 ...

  10. postman抓包工具与kap项目部署(新猿旺学习总结)

    postman抓包工具 1.post请求在哪里输入数据:选择请求方法-post--->在body里面如图位置输入参数和值,如果是json格式在raw出填写 get请求在哪里输入数据:选择请求方法 ...