一、作用域

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

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

二、作用域链和闭包

  全局变量只有一个(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. java8新特性学习笔记链接

    https://blog.csdn.net/yitian_66/article/details/81010434

  2. UML作业第一次:UML用例图绘制

    UML第一次作业 一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦 ...

  3. C#6.0,C#7.0新特性

    C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...

  4. PHP安装APC扩展,亲测成功

    1.在浏览器中输入https://pecl.php.net/package/APC选择安装包激进型下载.(可以选择Windows版本或者是Linux版本).注:以下是在Linux系统上进行操作!

  5. empty和isset区别

    isset判断变量是否已存在(配置) unset把变量删除(释放)掉 empty 判断变量是否为空 is_null 判断变量是否为NULL is_null,我们可以把它看成是!isset,是isset ...

  6. Web前端培训教程:CSS3动画怎么实现的

    动画 CSS3属性中有关于制作动画的三个属性: transform,transition,animation keyframes @keyframes mymove{ from{初始状态属性} to{ ...

  7. 问题 1672: 迷宫问题 (BFS)

    题目链接:https://www.dotcpp.com/oj/problem1672.html 问题 1672: 迷宫问题 时间限制: 1Sec 内存限制: 32MB 提交: 663 解决: 158 ...

  8. 刷Python核心编程第三版的习题时遇到一个findall的坑

    在用正则表达式做以下查找时,发现re.findall()对于正则表达式有没有圆括号是有区分的,具体如下 line = 'Tue Sep 18 12:48:21 2029::ilziuv@zcntzir ...

  9. hbase的一些要点

    hbase特点及简介: hbase源自于谷歌的三大论文之一 GFS -- hdfs MapReduce - MR BigTable - hbase hbase在以Hadoop为基础的生态圈中的地位 h ...

  10. unix socket服务器

    只能处理单个消息,一发一收. int loop(void) {   struct sockaddr_un client_addr;  int server_socket, client_socket; ...