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的执行过程,直观感知函数调用栈,作用域链,变量对象, ...
随机推荐
- vs2017 在win10下安装后开始运行asp.net core 项目时出错
vs2017 在win10下安装后开始运行asp.net core 项目时出错 报找不到什么 解决方法: 下载 asp.net 2.2 安装好,重新启动电脑问题解决.
- spy-debugger 安装以及使用
参考链接:https://github.com/wuchangming/spy-debugger
- [LeetCode] 120. Triangle _Medium tag: Dynamic Programming
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- Qt QLabel 大小随内容自动变化 && 内容填充整个label空间
图1:label的本身大小 图2:给label设置文字,不做任何别的设置 ui->label->setText(QObject::tr("current font is %1&q ...
- 蓝桥杯近三年决赛题之一(15年B组)
自己计时4小时做了试试,发现只用了2个小时多一点,第二题和第六题实在没办法,不会做,第五题用了暴力(过不了多少数据),其他三题在网上看了看 应该都是对的,下面放上试题及答案. 1. 标题:积分之迷 小 ...
- jquery datetimepicker 日期时间控件的使用及参数说明
首先下载 jquery.datetimepicker.css jquery.datetimepicker.main.js 1. 引入css和js (注:该控件要依赖于jquery) <link ...
- C# 实现http不同方法的请求
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Javascript基础语法(二)
三.运算符 1. 算术运算符 + - * / % ++ -- 1.1赋值运算符 = += . -= .*=. /= 1 +=2; ==> 1 = 1 + 2; 2. 比较运算符 > ...
- 菜鸟redis初学
该随笔为本人自学redis所遇到的错误,写这些初衷完全是为了避免以后犯相同的错误,如果对别人有帮助,那就相互促进. 在Java中使用redis,首先你的Jdk要能运行,如果没配置好,网上有很多jdk环 ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...