通过函数作用域和块级作用域看javascript的作用域链


Posted in Javascript onAugust 05, 2018

在ES6之前,javascript只有全局作用域和函数作用域。所谓作用域就是一个变量定义并能够被访问到的范围。也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这个变量定义在函数内部,那么就只能在函数内部访问到这个变量。

全局作用域只要页面没关闭就会一直存在,而函数作用域只有在函数执行的时候才存在,执行完就销毁。且每次执行函数都会创建一个新的作用域。

那么什么是作用域链呢?
在了解作用域链之前,我们先了解一个执行期上下文的概念。

执行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象(即AO或GO),一个执行期上下文定义了一个函数的执行环境,函数每次执行时对应的执行期上下文都是独一无二的,所以每次调用一个函数都会创建一个新的执行期上下文,当函数执行完毕,所产生的执行期上下文被销毁。

作用域链就是函数中[[scope]]属性所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。

作用域链更像是一种包含的关系。比如说函数A内部定义了一个函数B,所以B的定义是依赖于A的,也就是说B在A的内部,那么B中就可以访问A的中的变量和方法。这种一层一层向上依赖的关系就构成了作用域链。

为了更好理解,我们直接看例子。

var name = 'xiaoyu';
function fn1() {};
function fn2() {
 var num = 10;
 function fn3() {
  var num1 = 10;
  console.log(num);
 };
 return fn3;
}
var fn4 = fn2();

通过函数作用域和块级作用域看javascript的作用域链

在上个例子我们知道,fn2执行的时候返回fn3,产生了闭包。但是一个函数执行然后返回另一个函数都会产生闭包嘛?我们来看一下。

var name = 'xiaoyu';
function fn1() {};
function fn2() {
 var num = 10;
 function fn3() {//fn3函数没有依赖fn2函数内的变量
  var num1 = 10;
  console.log(num1);
 };
 return fn3;
}
var fn4 = fn2();

通过函数作用域和块级作用域看javascript的作用域链

了解了作用域链之后,我们来看一个小例子,巩固一下。

var age = 10;
var obj = {
 age: 12,
 test: function() {
  console.log(age);
  console.log(obj.age);
  console.log(this.age);
 }
}
obj.test();

console.log(this.age)打印出12不难理解,但是为什么console.log(age)不也应该打印出12嘛。

我们说test执行时首先会在自己的作用域内查看有没有age变量,然后再沿着作用域链往上到全局作用域查找age变量,全局作用域下有age变量和data变量。所以console.log(age)打印出的10,如果要打印出12则需要访问obj.age。

ES6的块级作用域

在ES6之后,通过let和const引入了块级作用域。即通过let和const声明的变量只在声明所在的块级作用域内有效,并且let声明的变量虽然属于全局变量,但不再属于全局对象window。

我们通过一段代码来看一下引入块级作用域后,函数的作用域链的变化。

var age = 10;
let obj = {
 age: 12,
 test: function() {
   console.log(age);
   console.log(obj.age);
   console.log(this.age);
 }
}
obj.test();

通过函数作用域和块级作用域看javascript的作用域链

Javascript 相关文章推荐
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
Jul 07 Javascript
js仿手机页面文件下拉刷新效果
Oct 14 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
javascript实现Java中的Map对象功能的实例详解
Aug 21 Javascript
详解Js中的模块化是如何实现的
Oct 18 Javascript
vue + element-ui实现简洁的导入导出功能
Dec 22 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
Dec 18 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 Javascript
vue实现简单的MVVM框架
Aug 05 #Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 #Javascript
详解Require.js与Sea.js的区别
Aug 05 #Javascript
vue中关闭eslint的方法分析
Aug 04 #Javascript
详解Vue取消eslint语法限制
Aug 04 #Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
Aug 04 #Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 #Javascript
You might like
php上传大文件设置方法
2016/04/14 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
Vuex提升学习篇
2018/01/11 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
提升Python程序运行效率的6个方法
2015/03/31 Python
Python实现快速多线程ping的方法
2015/07/15 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python @property装饰器原理解析
2020/01/22 Python
Python 必须了解的5种高级特征
2020/09/10 Python
Python中过滤字符串列表的方法
2020/12/22 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
会计学自我鉴定
2014/02/06 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
人事专员岗位说明书
2014/07/29 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
团支部书记竞选稿
2015/11/21 职场文书