JavaScript执行环境和作用域链
来源:互联网 发布:http使用的端口号 编辑:程序博客网 时间:2024/06/03 17:39
首先,给大家介绍下JavaScript的执行环境,执行环境就是有权访问的变量与函数的集合,称之为变量对象,首先,js 中全局执行环境是最外层的一个执行环境,在浏览器中,全局执行环境就是window对象,另外每个函数也有自己的执行环境,当执行环境中的代码执行完毕后,该执行环境被销毁,保存在其中所有的变量和函数定义也随之销毁(而全局作用域直到关闭网页或浏览器时才被销毁)
js里面没有块级执行环境(es6里面有),但是有函数执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈中(如果你理解栈,你可以深入了解为什么有作用域链)而在函数执行后,栈将其弹出,把控制权返回给之前的执行环境,所以执行流实际就是栈机制。
那么什么是作用域链呢?当函数执行时,会创建一个作用域链,作用域的作用就是保证执行环境对有权访问的变量与函数的有序访问。作用域的前端始终是一个活动对象(包含了函数的arguments,局部变量等)而作用域链的下一个变量对象则是下一个包含环境,这样一直延续到全局环境,全局环境始终是作用域链的最后一个对象。
而标识符解析就是沿着作用域链一级一级地搜索标识符的过程,从作用域的最前端逐级向后回溯,直到找到一个就停止搜索,如果找不到就报错
看下面一个例子具体说明
var a = 5;function fun1(){var a = 3;var b = 4;function fun2(){var c = a;b = c;console.log(c); //3}fun2();console.log(b); //3}fun1();上面的例子有3个执行环境,一个全局执行环境,和fun1()局部执行环境和fun2()局部执行环境,全局执行环境里面有a变量和fun1函数,fun1()执行环境里面也有一个a变 量,b变量和fun2函数,fun2()执行环境里面有c变量,那么下面的图是作用域链图示。矩形表示执行环境,内部函数可以通过作用域链访问外层环境中的变量,但是反之不行
那么解析标识符,就会沿着函数的作用域链从最前端向后搜索,直到搜索到同名的标识符就停止搜索,比如在fun2环境里访问a变量,但是在fun2的自身的活动对象里面并没有,所以会在上一级fun1的环境里面搜索,发现找到了a,则停止搜索,所以这就是为什么在fun2执行环境里面访问的a值不会是全局环境里面的那个a值。
- JavaScript执行环境和作用域链
- JavaScript执行环境和作用域链
- JavaScript作用域和执行环境
- JavaScript作用域和执行环境
- JavaScript执行环境和作用域
- JavaScript学习-执行环境和作用域
- javascript执行环境和作用域
- JavaScript中的执行环境、变量对象和作用域链
- javascript中的执行环境和作用域链
- 重温javascript--执行环境和作用域链
- JavaScript变量对象、执行环境和作用域链
- 如何理解javascript执行环境和作用域链?
- javascript中作用域链和执行环境的理解
- javascript中执行环境和作用域链的概率
- javascript执行环境、作用域链
- javascript作用域链,执行环境
- JavaScript:执行环境及作用域链
- Javascript 执行环境,作用域链分析
- 虚函数和纯虚函数的区别
- sublime中如何用less实现css预编译
- 南阳理工acm 219 An problem about date(蔡勒公式)
- 带动画的圆形进度条
- MySQL数据库备份与恢复
- JavaScript执行环境和作用域链
- SpringMVC实践指南-第一集
- 字典树简介、应用以及与哈希表的比较
- SwitchCompat使用小结
- 我为什么注册 CSDN,而又不用?
- 学习贝叶斯
- 一个数组实现两个栈
- android学习—添加/删除module,xutils的添加
- Android Edittext 的 回车监听