JS进阶系列之作用域链
在之前写的进阶系列里面,提到了
执行上下文在创建阶段,要创建变量对象、确定作用域链还有确定this的指向,本次将重点讲解一下作用域链。
JavaScript代码的执行过程
在讲解作用域链之前,首先了解一下,JavaScript代码的执行过程,包括两个步骤:
- 编译阶段
- JavaScript引擎执行阶段

在编译阶段主要做的是,经过编译器的编译,将代码转化为可执行的代码,其中就包括了作用域规则的确定,而在之前说的执行上下文的创建和执行阶段是发生在JavaScript隐引擎执行阶段,所以作用域链是在执行上下文创建阶段才产生的,这时候,可能你会疑惑,作用域和作用域链有什么区别呢?
什么是作用域?
作用域为一套规则,用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符查找变量。
在JavaScript中,主要的作用域有两种:
- 全局作用域
- 函数作用域
什么是作用域链?
作用域链是由当前执行环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。
而作用域与作用域链的区别主要在于:
作用域是一套规则,作用域链是作用域的具体实现。
讲理论可能有些空洞,那么我就举个具体的例子来说明什么是作用域链吧
demo01
var a = 20;
function test(){
var b = a + 20;
function innerTest(){
var c = 10;
return b + c;
}
return innerTest();
}
test();
在这个例子中,按照之前讲解的
- 先创建执行上下文,按照,
globalEC—>testEC—>innerTestEC的顺序,压入调用栈中,其中主要讨论innerTest()的作用域链。 - 按照作用链的定义,可以得出
innerTest()执行上下的结构,如下
innerTestEC = {
VO:{ c:10},
scopeChain:[VO(innerTest),VO(test),VO(global)],
this:{...}
}
可以看出,innerTest()的作用域链就是由当前的执行环境与上层的执行环境中的一系列变量对象组成,所以innerTest()就能访问到上层执行上下文中,变量对象中的属性和方法,这就是作用域链。
- 看一下
innerTest()的作用域链图,如下:

JS进阶系列之作用域链的更多相关文章
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
原网址:https://segmentfault.com/a/1190000002778015 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --< ...
- 【 D3.js 进阶系列 】 进阶总结
进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...
- 【 D3.js 进阶系列 — 4.0 】 绘制箭头
转自:http://www.ourd3js.com/wordpress/?p=660 [ D3.js 进阶系列 — 4.0 ] 绘制箭头 发表于2014/12/08 在 SVG 绘制区域中作图,在绘制 ...
- JS进阶系列之内存空间
也许很多人像我一样,觉得JS有垃圾回收机制,内存就可以不管了,以至于在全局作用域下定义了很多变量,自以为JS会自动回收,直到最近,看了阮一峰老师,关于javascript内存泄漏的文章时,才发现自己写 ...
- JS 执行环境与作用域链
1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...
- 【 D3.js 进阶系列 — 1.1 】 其它表格文件的读取
CSV 表格文件是以逗号作为单元分隔符的,其他还有以制表符 Tab 作为单元分隔符的 TSV 文件,还有人为定义的其他分隔符的表格文件.本文将说明在 D3 中怎样读取它们. 1. TSV 表格文件是什 ...
- JS -- The Scope Chain 作用域链
The Scope Chain JavaScript is a lexically scoped language: the scope of a variable can be thought of ...
- 对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?
首先先引用<JavaScript权威指南>里面的一句话来开始我的博客:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 因此,就出现了如下的几串代码: ...
- JS执行环境,作用域链及非块状作用域
JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...
随机推荐
- 008-jdk1.7版本新特性
一.JDK1.7 名称:Dolphin(海豚) 发布日期:2011-07-28 新特性: 1.1.switch-case中可以使用字串 区分大小写.Java编译器通过switch使用String对象的 ...
- 人活着系列之开会(Floy)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2930 题意:所有点到Z点的最短距离.因为岛名由 ...
- PAT 1076 Forwards on Weibo[BFS][一般]
1076 Forwards on Weibo (30)(30 分) Weibo is known as the Chinese version of Twitter. One user on Weib ...
- [LeetCode] 836. Rectangle Overlap_Easy
A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...
- print(array)时array中间是省略号没有输出全部的解决方法
import numpy as np np.set_printoptions(threshold=np.inf) 大量元素情况 可以采用set_printoptions(threshold='nan' ...
- Twitter OA prepare: Two Operations
准备T家OA,网上看的面经 最直接的方法,从target降到1,如果是奇数就减一,偶数就除2 public static void main(String[] args) { int a = shor ...
- map() 方法
1. 方法概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 2. 例子 2.1 在字符串中使用map 在一个 String 上使用 map 方法获取字符串中每 ...
- Servlet—作controller控制层
servlet控制器的改造步骤: 1.编写servlet类,和访问路径 2.修改jsp请求路径 servlet参数配置---获取初始化参数 servlet参数配置---全局参数
- 3:2 OGNL 简介
OGNL : (对象图导航语言) 从一个对象到另一个对象 OGNL来源于Xwork: OGNL的作用: OGNL在数据进出值栈的时候进行类型转换
- zw版【转发·台湾nvp系列Delphi例程】HALCON FastThreshold2
zw版[转发·台湾nvp系列Delphi例程]HALCON FastThreshold2 FastThreshold_Delphi_2.PNG procedure TForm1.Button1Clic ...