js执行环境、作用域、作用域链、变量提升、函数提升

1.执行环境(execution context)

  执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有与之对应的变量对象(variable object),保存着该环境中定义的所有变量和函数。我们无法通过代码来访问变量对象,但是解析器在处理数据时会在后台使用到它。

  执行环境有全局执行环境(也称全局环境)和函数执行环境之分。执行环境如其名是在运行和执行代码的时候才存在的,所以我们运行浏览器的时候会创建全局的执行环境,在调用函数时,会创建函数执行环境。

1.1 全局执行环境

  全局执行环境是最外围的一个执行环境,在web浏览器中,我们可以认为他是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。代码载入浏览器时,全局环境被创建,关闭网页或者关闭浏览时全局环境被销毁。

1.2 函数执行环境

  每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就被推入一个环境栈中,当函数执行完毕后,栈将其环境弹出,把控制权返回给之前的执行环境。

2 作用域、作用域链

2.1 全局作用域(globe scope)和局部作用域(local scope)

全局作用域可以在代码中的任何地方都能被访问,局部作用域一般只在固定的代码片段内可以访问得到。

2.2 作用域链(scope chain)

       全局作用域和局部作用域中变量的访问权限,其实是由作用域链决定的。

  每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。作用域链是函数被创建的作用域中对象的集合。作用域链可以保证对执行环境有权访问的所有变量和函数的有序访问。

  作用域链的最前端始终是当前执行的代码所在环境的变量对象(如果该环境是函数,则将其活动对象作为变量对象),下一个变量对象来自包含环境(包含当前还行环境的环境),下一个变量对象来自包含环境的包含环境,依次往上,直到全局执行环境的变量对象。全局执行环境的变量对象始终是作用域链中的最后一个对象。

  标识符解析是沿着作用域一级一级的向上搜索标识符的过程。搜索过程始终是从作用域的前端逐地向后回溯,直到找到标识符(找不到,就会导致错误发生)。

3 变量提升、函数提升

变量提升,就是把变量声明提升到函数的顶部,需要注意的是,变量提升只是提升变量的声明,不会把变量的值也提升上来。

函数提升,就是在代码开始执行之前,解析器就已经读取并将函数声明添加到执行环境中。所以,即使声明函数的代码在调用它的代码后面,js引擎也能把函数声明提升到顶部。

函数有三种定义方法:函数声明、函数表达式、Function构造函数。其中只有函数声明形式才能被提升。

猜你喜欢

转载自blog.csdn.net/w3624270/article/details/81482821