分享人:严泽浩
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。 我们编写的代码是无法访问这个对象的,但解析器在处理数据时会在后台使用它。
全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境被认为是window对象, 因此所有全局变量和函数都是作为window对象的属性和方法来创建的。 某个执行环境中的所有代码执行完毕后,该环境就会被销毁,保存在其中的所有变量和函数定义也随之销毁。
如果所在环境是函数,那么就会把这个函数的活动对象作为变量对象(在函数中,变量对象==活动对象)。 一般而言,函数执行过程,可以分成两步:1.进入执行环境;2.执行代码。
当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。执行之后,再从环境栈中弹出。
JavaScript解释器在浏览器中是单线程的,这意味着浏览器在同一时间内只执行一个事件, 对于其他的事件我们把它们排队在一个称为 执行栈的地方。 我们已经知道,当浏览器第一次加载你的script,它默认的进了全局执行环境。 如果在你的全局代码中你调用了一个函数,那么顺序流就会进入到你调用的函数当中, 创建一个新的执行环境并且把这个环境添加到执行栈的顶部。 如果你在当前的函数中调用了其他函数,同样的事会再次发生。 执行流进入内部函数,并且创建一个新的执行环境,把它添加到已经存在的执行栈的顶部。 浏览器始终执行当前在栈顶部的执行环境。一旦函数完成了当前的执行环境,它就会被弹出栈的顶部, 把控制权返回给当前执行环境的下个执行环境。
作用域链与一个执行上下文相关,是内部上下文所有变量对象(包括父变量对象)的列表,用于变量查询。 作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。
问题1:函数的完整生命周期是怎样的?
标识符解析是沿着作用域链一级一级向上(外)搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级向后回溯,直至找到标识符为止。
其中内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部变量环境中的任何变量和函数。这些环境之间的练习是线性的,有次序的。每个环境变量都可以向上搜索作用域链,以查询变量和函数名;反之则是不行。
参考一:执行环境与作用域
感谢大家观看
BY : 严泽浩