作用域(scope):一个变量的可用范围

2种:
全局作用域 :任何地方都可以访问,反复使用

函数作用域(局部作用域):仅在函数内部可访问,不能反复使用
例子:

var a=10;function fun(){var a=100;a++;console.log(a);}fun();//101console.log(a);//10

函数的生命周期

作用域前言
每个函数都有自己的执行环境,(首先,所有的环境会形成 一个环境栈)。当代码执行进入一个函数后(也就是开始执行函数里的代码了),函数的执行环境会被推进(push)这个大的环境栈中,当函数执行完成后,大的环境栈就会将该函数的环境栈挤出(pop),并将控制权交还给原先的执行环境,就是在回到原来的执行流上去了。

当代码在执行环境中执行时,变量对象的作用域链就被创建了。作用域链的目的就是为执行环境有权访问的变量和函数提供有序的访问,不让其乱套。有顺序的来。作用域链的前端(或最接近的,最里面的,最里层的)始终都是当前正在执行的代码所在的执行环境的变量对象。

如果执行环境是函数,则将其活动对象(activation object)简称:AO 作为变量对象。活动对象最开始只包含一个变量,arguments对象(在全局环境中不存在)。这就是该函数的作用域链上最前端的,最里面的了,该作用域链上下一个变量对象就是来自于包含(即外部)环境,再下一个也是来自再下一个外部环境,一层一层的逐渐的往外剥皮,知道最外面的全局环境。全局环境的变量对象就是该作用域链上最后一个对象了。

注释:’‘函数的作用域链上最前端的,最里面’'指的是预编译将全局对象中的声明和函数(执行函数列表参数,声明变量,函数内部嵌套的函数)提升到最上方,从上至下执行。-----可以百度参考变量提升和函数提升,或js预编译

1、开始执行前
1-1 创建执行环境栈(ECS数组):临时保存正在执行的函数的环境
1-2 向执行环境栈中加入第一个默认函数main()
1-3.创建全局作用域对象window

2、定义函数时
2-1.创建函数对象,封装定义
2-2. 声明函数名变量,引用函数对象
2-3. 函数对象的scope属性引用回,创建函数时的作用域


3、调用函数时
3-1 ESC中加入一个新的元素(执行环境),记录新函数调用
3-2 创建一个活动对象,保存本次函数调用用到的局部变量
3-3 ESC新执行环境元素,引用活动对象
3-4 活动对象中的parent属性引用函数的scope指向的父级作用域对象
3-5 在执行过程中:优先使用活动对象中的局部变量
3-6 局部中没有,才延parent向父级作用域找*

** 4、调用函数后
4-1 执行环境栈中本次函数的执行环境出栈
4-2 导致活动对象被释放 导致局部变量一同释放

作用域链

作用域链*:由多级作用域连续引用形成的链式结果
掌管一切变量的使用顺序: 先在局部找,没有,就延作用域向父级作用域找

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

当一个函数创建后,它实际上保存一个作用域链,并且作用域链会被创建此函数的作用域中可访问的数据对象填充。例如定义下面这样一个函数:

function func() {
var num = 1;
alert(num);
}
func();

在函数func创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示(注意:图片只例举了全部变量中的一部分):

执行此函数时会创建一个称为“运行期上下文(execution context)”(有人称为运行环境)的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。

这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链中。它们共同组成了一个新的对象,叫“活动对象(activation object)”,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图所示:

外部环境不能访问内部环境的任何变量和函数。即可以向上搜索,但不可以向下搜索。

可以理解为什么有关于作用域链的定义说,作用域链是一群对象,或者对象列表(链表)。也有总结如下:

对于javascript最顶层的代码(不包含任何函数定义内的代码),其作用域链只包含一个对象:即全局对象。
对于不包含嵌套函数的函数,其作用域链包含两个对象:其自身的变量对象和全局变量对象。
对于包含了嵌套函数的函数,其作用域包含至少三个对象:自身的变量对象,外层的(将自身嵌套的),全局变量对象。

作用域和作用域链 精解相关推荐

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

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

  2. JS进阶学习(作用域、函数进阶、解构赋值、原型链)

    文章目录 1.面相对象编程介绍 2.ES6中的类和对象 3.类的继承 ES6中的类和对象 三个注意点 作用域 局部作用域 全局作用域 作用域链 JS垃圾回收机制(GC) JS垃圾回收机制-算法说明 闭 ...

  3. JavaScript作用域和作用域链详解

    JavaScript作用域链详解 一.JavaScript作用域 JavaScript作用域是什么? 作用域范围 二.JavaScript作用域链 作用域与执行上下文 总结 一.JavaScript作 ...

  4. 详解JS 作用域与作用域链

    作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下作用域和作用域链到底是个什么: 先上一段代码: var a = 'jack' ...

  5. 作用域和作用域链详解

    1. *****作用域和作用域链 作用域scope:       什么是: 一个变量的使用范围--使用                  本质上作用域是一个对象--存储                 ...

  6. JS 作用域和作用域链

    作用域 JavaScript 中的作用域是我们可以有效访问变量或函数的区域.作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 有两种类型的作用域:全局作用域.局 ...

  7. JavaScript 作用域(Scope)详解

    JavaScript 作用域(Scope)详解 先对需要用到的名词解释一下,再通过例子深入理解 一.什么是作用域(Scope) [[scope]]:每个javascript函数都是一个对象,对象中有些 ...

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

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

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

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

  10. 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例

    函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

最新文章

  1. 架构革新路漫漫,京东智联云自研服务器设计细节探秘
  2. 小学四年级下册计算机考试试题,四年级信息技术下学期测试题
  3. tensorflow中的正则化解决过拟合问题
  4. Android开发之Java基础面试题抽象类和接口的区别
  5. C#的变迁史06 - C# 4.0 之并行处理篇
  6. sql script: Calculating Days
  7. 关于做PDF的FAQ(一)~(四)
  8. html教程:网页字体的设置
  9. 声网传输层协议 AUT 的总结与展望丨Dev for Dev 专栏
  10. stm32通过ESP8266连接互联网服务器,手机通过网页实现远程控制灯亮灭
  11. 5 个改善代码可读性的方法
  12. “三天打鱼两天晒网问题
  13. Django新建项目(Linux操作系统)
  14. Gradle may disable incremental compilation as the following annotation processors are not ......
  15. HikariCP连接池:Possibly consider using a shorter maxLifetime value.
  16. String类字符串习题作业
  17. PCB阻抗设计及Polar Si9000 PCB阻抗计算软件的使用
  18. 走进常熟东南相互电子,看AI如何深入产业让工厂更智能
  19. 【华为OD机试真题 C语言】23、按身高和体重排队 | 机试真题+思路参考+代码解析
  20. mathtype公式字体改为latex公式字体的方法

热门文章

  1. Grails in Action:完成啦
  2. 洛谷P6685 可持久化动态仙人掌的直径问题
  3. 如何维持手机电池寿命_关于如何延长智能手机电池寿命的一些提示
  4. 对信息断舍离进行时——一段自我反省
  5. 多线程通信Queue
  6. 机器学习学习笔记(3)——量纲与无量纲,标准化、归一化、正则化
  7. Java JDK8/JAVA8以及后版本收费后还能用吗
  8. css淡入动画,使用CSS淡入大动画效果
  9. 不规则数据排序 Python sort sorted
  10. CentOS 6各版本镜像合集下载