文 / 景朝霞
来源公号 / 朝霞的光影笔记
ID / zhaoxiajingjing
图 / 自己画

❥❥❥❥点个赞,让我知道你来过~❥❥❥❥


前情提要:

  1. 题目 | let和var的区别(一、二)
  2. 图解 | let和var的区别(一、二)
  3. 题目 | 带VAR和不带VAR的区别
  4. 图解 | 带VAR和不带VAR的区别
  5. 总结 | LET和VAR区别(三、四)

0 /

GO/VO/AO

  • ECStack:Execution Context Stack 执行环境栈
  • EC:Execution Context 执行环境(执行上下文)
    • VO:Variable Object 变量对象
    • AO:Activation Object 活动对象
  • Scope:作用域
  • Scope Chain:作用域链
  • GO:global object 全局对象

1 /

图解来啦~

var ary = [1, 2];
function fn(ary) {console.log(ary);ary[0] = 10;ary = [10];ary[0] = 0;console.log(ary);
}
fn(ary);
console.log(ary);

咱前面说的(↑前情提要蓝色字可穿越)浏览器在执行代码前会先进行变量提升,那下面这张图呢,再来加点料。

【图一】画了这些东西:

  1. 浏览器在执行代码时,会开辟出一个专门执行代码的栈内存空间:执行栈(ECStack)
  2. 会有一个全局的执行上下文(EC(G)在浏览器中会指向window),把执行上下文压入执行栈里面进行代码执行:进栈。如果执行完以后没有用了呢,会出栈;有的还有用的,暂时不执行它了,会被压入栈底,换别的来执行(以后再告诉你她叫啥~)
  3. 在EC(G)里面有一个全局对象GO,在浏览器里面会把它赋值给window
  4. 有一块地名叫VO的是用来存储全局上下文的变量
  5. 基本数据类型直接存放在栈内存中;引用数据类型则都存在堆内存中,把堆地址赋值给变量名

【图二】看看多了啥呀~

  1. 函数创建时,初始化了当前函数的作用域,也就是它的户口所在地:FN[scope]:VO(G)。即:[[scope]] =所在上下文EC中的变量对象VO/AO

    • 浏览器的执行栈:ECStack
    • 代码执行的上下文:EC(G) 全局执行上下文,EC(FN)函数执行上下文
      • VO 变量对象——只有全局执行上下文里面才有:存放着全局上下文的变量
      • AO 活动对象——函数执行上下文里面才有,是VO的一个分支:存放着函数执行上下文的变量
    • 作用域:函数创建的地方,它的户口所在地
  2. 每一次一个函数执行都会创建一个全新的函数执行上下文,AO里面存放着当前这个上下文的一些东西

    • 初始化THIS指向

    • 初始化作用域链:scopeChain:<自己执行的创建的变量对象, 户口所在地>

    • arguments 实参集合

    • 形参赋值、变量提升…

  3. 还有很重要的一步:请看下图【图三】

(OS:这里不是俄罗斯套娃呀~~~)执行栈、执行上下文、作用域、作用域链 动手画起来~呀!

【图三】我不是故意要画这么长的~

当函数执行时,会创建一个全新的执行上下文,它肯定是必须要放在执行栈里面的。

此时,EC(G)全局执行上下文暂时不执行了,会把它往栈底压,把需要执行的EC(FN)函数执行上下文放到栈里面执行。

函数执行:

  1. 创建一个全新的执行上下文,放到执行栈中
  2. 初始化THIS
  3. 初始化作用域链scopeChian:<AO, xxx>
  4. AO变量对象存储内容:arguments、形参赋值、变量提升…
  5. 代码执行

当EC(FN)中的代码执行完了,它没有被外界占用的东西了,它就可以出栈了。那么,浏览器会择一个良辰吉时(浏览器的垃圾回收机制)把它释放并销毁。EC(G)就会重新调回来继续执行了。

请看【图四】【图五】

2 /

多画图、自己画

那么,就把之前的题目自己重新画一遍吧~

  1. 题目 | let和var的区别(一、二)
  2. 图解 | let和var的区别(一、二)
  3. 题目 | 带VAR和不带VAR的区别
  4. 图解 | 带VAR和不带VAR的区别
  5. 总结 | LET和VAR区别(三、四)

3 /

背、背、背

Array.prototype上的方法名字背成绕口令的速度脱口而出

  1. toLocaleString、toString
  2. push、pop、shift、unshift
  3. concat、slice、splice
  4. reverse、sort
  5. every、filter、forEach、map、some
  6. indexOf、lastIndexOf
  7. reduce、reduceRight
  8. join
  9. copyWithin、entries、fill、find、findIndex、flat、flatMap、includes、keys、values

绕口令呀

​ 八百标兵奔北坡,

​ 炮兵并排北边跑。

​ 炮兵怕把标兵碰,

​ 标兵怕碰炮兵炮。

来,捋顺一下舌头

​ 八了百了标了兵了奔了北了坡,

​ 炮了兵了并了排了北了边了跑。

​ 炮了兵了怕了把了标了兵了碰,

​ 标了兵了怕了碰了炮了兵了炮。

方法的用法请参考:

  1. 《JavaScript高级程序设计(第3版)》5.2节
  2. 地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

先背过方法名、再熟知方法的用途。先简易的来,然后再一层层往上加,慢就是快

整理方法可以从4个维度:1. 功能 2. 参数 3. 返回值 4. 原数组:是否变化

图解 | JavaScript的作用域和作用域链相关推荐

  1. 图解Javascript——作用域、作用域链、闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  2. JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制

    2019独角兽企业重金招聘Python工程师标准>>> 执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在 ...

  3. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(上)

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  4. Javascript的作用域,作用域链,闭包

    1,作用域和作用域链概念 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.1 全局作用域,在代码 ...

  5. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  6. JavaScript重难点解析4(作用域与作用域链、闭包详解)

    JavaScript重难点解析4(作用域与作用域链.闭包详解) 作用域与作用域链 作用域 作用域与执行上下文 作用域链 闭包 闭包理解 将函数作为另一个函数的返回值 将函数作为实参传递给另一个函数调用 ...

  7. javascript精雕细琢(三):作用域与作用域链

    目录 引言 1.执行环境 2.作用域与作用域链 引言 作用域与作用域链是JS应用中无时无刻不在影响程序运行的关键属性,但是由于它的不可见性,或者说它存在的过于普遍,简直就像空气一样.所以对它的谈及,都 ...

  8. Javascript 运行上下文和作用域链

    一.作用域Scope和上下文Context 在javascript中,作用域scope和上下文context是两个不同的概念.每个函数调用都会伴随着scope和context,从本质上来说,scope ...

  9. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

最新文章

  1. 入门 | CNN也能用于NLP任务,一文简述文本分类任务的7个模型
  2. Postgre约束详解
  3. c枚举类型enum例题_SystemVerilog数据类型
  4. Linux发邮件之mail命令
  5. 聊聊一致性Hash在负载均衡中的应用
  6. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)
  7. linux svn 设置propertise
  8. 《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
  9. 齐齐哈尔计算机二级,2020齐齐哈尔市计算机二级报名时间|网上报名入口【8月20日9时开通】...
  10. Spring中注册Bean的方式有哪些?
  11. linux odbc 配置文件,linux操作系统配置ODBC数据源
  12. easyui java下拉列表项目_EasyUI/TopJUI之如何动态改变下拉列表框ComboBox输入框的背景颜色...
  13. Aras Innovator: 扩展Part类型,管理更多的物体类型
  14. AR入门之动画的制作与导入
  15. 如何使用自己的云服务器做代理服务器
  16. Python基础知识练习(含答案)
  17. Moblin授权中心在台北挂牌开业
  18. 远景能源面试+高管终面
  19. 【信号与系统学习笔记】—— 拉普拉斯反变换+由零极点图对傅里叶变换几何求值
  20. 前端教程:LAMP是什么意思?做什么的?有什么特点?

热门文章

  1. bash脚本中出现[[:not found错误的解决方法
  2. ubuntu 下查看caj文件
  3. 快马探营:移动MM“热料”解密
  4. 《驯服烂代码》第一章
  5. Shader算法之Rim
  6. K3欠料计算存储过程
  7. 购物平台全店商品爬虫案例
  8. U1.自然语言处理简介_刘知远老师NLP训练营笔记
  9. 任何一个合数可由几个质数相乘得到
  10. 单片机基础(五):定时/计数器的工作原理及工作方式