Javascript高级编程学习笔记(10)—— 作用域、作用域链
昨天介绍了,JS中函数的作用域
什么词法环境之类的,可能很多小伙伴不太明白。
在今天的内容开始之前,先做个简短的声明:
词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let、const声明的变量、函数
而在ES3中对变量相关的信息都保存在变量对象上;
从功能上来说变量对象可以看作是词法环境中的环境记录
两者从功能上来说区别不大,只是不同版本的ES有不同的说法
为了保持与前文的一致,这篇文章中我还是用环境记录来描述JS保存当前执行环境(上下文)中定义的变量和函数的对象
ES6之前JS中的作用域只有全局作用域和局部作用域(函数作用域)两种,后文将基于此进行解释
作用域
作用域联系前文我们可以理解为执行环境(上下文)中的词法环境
而每个作用域都由一个保存变量的对象(环境记录)和一个指向外部词法环境的outer(对外部环境引用)构成
作用域之间的嵌套关系由outer来维护
一个个作用域通过outer形成的链式结构就被称作作用域链
在《js高级程序设计》中把执行栈顶端的执行环境(上下文)中的作用域(词法环境)称为活动对象
作用域链
那么作用域链是干嘛的呢?
作用域链就是让我们能在子作用域中访问父作用域链中的变量的
在解释作用域的时候我提过,每个作用域都包含了一个对外部作用域的引用,这个引用是单向的
这也是子作用域能访问父作用域,而父作用域不能访问子作用域的原因

当我们在使用变量的时候,JS会解析标识符,解析实际上就是一个沿着作用域链一层层搜索标识符的过程
在搜索标识符这一过程中,只要搜索到符合的标识符就会立即停止搜索
这也就是当父级作用域和子作用域有同名变量时,JS以子作用域中的为准的原因
延长作用域链
在JS中除了函数之外,还有一些语句也会产生作用域,从而延长作用域
1.try-catch中的catch会产生一个新的作用域
2.with语句 会将指定对象作为作用域添加到执行栈的顶端
在使用上方的语句时需要注意一下
PS . IE8 之前的JS版本中catch会将错误对象添加到当前的执行环境的变量对象中,而不是新建一个,IE9中修复了该bug
没有块级作用域
在ES6之前JS是没有块级作用域的,也就是大括号之间的代码块不会产生一个独立的作用域
也就是说花括号中间声明的变量会添加到当前的执行环境中
这也是for循环中声明的 i 在外部也能访问的原因
最近的文章可能都没有什么例子的配合了,一是有些东西实在不好举例,二是自己水平有限
望谅解,JS中的闭包等问题会在后面介绍object里面的function类型的时候介绍
Javascript高级编程学习笔记(10)—— 作用域、作用域链的更多相关文章
- Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域
昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...
- JavaScript高级程序设计学习笔记--变量、作用域和内存问题
传递参数 function setName(obj){ obj.name="Nicholas"; obj=new object(); obj.name="Greg&quo ...
- Javascript高级编程学习笔记(93)—— Canvas(10) 模式及图像数据
模式 模式其实就是重复的图像,用来填充或描边图形 要创建一个新模式,可以调用 createPattern()并传入两个参数 一个HTML img元素 用于表示如何重复的字符串 "repeat ...
- Javascript高级编程学习笔记(66)—— 事件(10)变动事件
变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...
- Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...
- Javascript高级编程学习笔记(24)—— 函数表达式(2)闭包
昨天的文章中主要记录了,函数表达式与函数声明的区别 以及在JS中如何安全地使用递归 那么既然要深入地理解JS中的函数,闭包就是一个绕不开的概念 闭包 JS高编一书中对闭包的概念定义如下: 闭包是指有权 ...
- Javascript高级编程学习笔记(6)—— 流程控制语句
话不多说,我们直接开始进入今天的主题 流程控制语句 首先什么是流程控制语句呢? 顾名思义,就是控制流程的语句. 在JS中语句定义了ECMAScript中的主要语法,让我们可以使用一系列的关键字来完成指 ...
- Javascript高级编程学习笔记(3)—— JS中的数据类型(1)
前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...
- JavaScript高级编程学习笔记(第三章之一)
继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...
随机推荐
- 最适合入门的Laravel中级教程(二)用户认证
之前的初级教程主要是学习简单的增删改查: 接着的中级教程的目标是在初级教程的基础上能写出更复杂更健壮的程序: 我们先来学习 laravel 的用户认证功能: 在现代网站中基本都有用户系统: 而我们每开 ...
- Linux网络编程学习(二) ----- 进程控制(第三章)
1.进程和程序 程序是一个可执行文件,而一个进程是一个执行中的程序实例.一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序.比如几个用户可以同时运行一个编辑程序, ...
- SVN中英文菜单对照
TortoiseSVN英文版菜单中文翻译01.SVN Checkout(SVN取出) 点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址,在C ...
- WordCount 3
学号:201631062130.201631062304 码云地址:https://gitee.com/xnsy/WordCountPlus 一.代码互审情况:在代码的互审过程中,在命令和路径没有没有 ...
- OkHttp 同步异步操作
OkHttp是一个Java和Android的HTTP和HTTP/2的客户端,负责发送HTTP请求以及接受HTTP响应. 一.使用OkHttp OkHttp发送请求后,可以通过同步或异步地方式获取响应. ...
- Oracle修改表结构字段名和字段长度
添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter ...
- react项目搭建
1.下载安装node.js,需要node.js环境. 2.经过挑选,决定选择creat-react-app这个项目脚手架,然后输入指令安装 $ npm install -g crea ...
- 综合评价模型C++实现
1 综合评价模型建立步骤 综合评价模式是一种对一个或多个系统进行评价的模型.一般分为如下几个步骤: 选取评价指标,指标的选取应该具有独立性和全面性. 得到m×n测量矩阵,每一行表示一个带评价系统(共m ...
- python 2与python3 区别
源码区别 python3:python2 a) py3 优美简单清晰. b) py2:源码重复,混乱,不规范,冗(rong)余(不需要特多,啰嗦). test a) py3:可以中文也可以英文( ...
- 如何学好游戏3D引擎编程
注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 <如何学好游戏3D引擎编程>此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才 ...