实行环境及作用域

实行环境(execution context,为简朴起见,偶然也称为“环境”)是 JavaScript 中最为主要的一个观点。实行环境定义了变量或函数有权接见的其他数据,决议了它们各自的行动。每一个实行环境都有一个与之关联的变量对象(variable object),环境中定义的一切变量和函数都保留在这个对象中。虽然我们编写的代码无法接见这个对象,但剖析器在处置惩罚数据时会在背景运用它。

全局实行环境是最外围的一个实行环境。依据 ECMAScript 完成地点的宿主环境差别,示意实行环,因境的对象也不一样。在 Web 浏览器中,全局实行环境被认为是 window 对象(第 7 章将细致议论)
此一切全局变量和函数都是作为 window 对象的属性和要领建立的。某个实行环境中的一切代码实行终了后,该环境被烧毁,保留在个中的一切变量和函数定义也随之烧毁(全局实行环境直到应用顺序退
出——比方封闭网页或浏览器——时才会被烧毁)。

每一个函数都有本身的实行环境。当实行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数实行以后,栈将其环境弹出,把掌握权返回给之前的实行环境。ECMAScript 顺序中的实行流恰是由这个轻易的机制掌握着。

当代码在一个环境中实行时,会建立变量对象的一个作用域链(scope chain)。作用域链的用处,是保证对实行环境有权接见的一切变量和函数的有序接见。作用域链的前端,一向都是当前实行的代码地点环境的变量对象。假如这个环境是函数,则将其运动对象(activation object)作为变量对象。运动对象在最最先时只包括一个变量,即 arguments 对象(这个对象在全局环境中是不存在的)。作用域链中的下一个变量对象来自包括(外部)环境,而再下一个变量对象则来自下一个包括环境。如许,一向延续到全局实行环境;全局实行环境的变量对象一向都是作用域链中的末了一个对象。

标识符剖析是沿着作用域链一级一级地搜刮标识符的历程。搜刮历程一向从作用域链的前端最先,
然后逐级地向后回溯,直至找到标识符为止(假如找不到标识符,通常会致使毛病发作)。

在部分作用域中定义的变量能够在部分环境中与全局变量交换运用,如下面这个例子所示:

var color = "blue";
function changeColor(){
    var anotherColor = "red";
    function swapColors(){
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
        // 这里能够接见 color、anotherColor 和 tempColor
    }
    // 这里能够接见 color 和 anotherColor,但不能接见 tempColor
    swapColors();
}
// 这里只能接见 color
changeColor();

以上代码共触及 3 个实行环境:全局环境、 changeColor() 的部分环境和 swapColors() 的部分
环境。全局环境中有一个变量 color 和一个函数 changeColor() 。 changeColor() 的部分环境中有一个名为 anotherColor 的变量和一个名为 swapColors() 的函数,但它也能够接见全局环境中的变量 color 。 swapColors() 的部分环境中有一个变量 tempColor ,该变量只能在这个环境中接见到。不管全局环境照样 changeColor() 的部分环境都无权接见 tempColor 。但是,在 swapColors() 内部则能够接见其他两个环境中的一切变量,由于那两个环境是它的父实行环境。图 4-3 抽象地展现了前面这个例子的作用域链。
《实行环境及作用域》

《实行环境及作用域》

图中的矩形示意特定的实行环境。个中,内部环境能够经由过程作用域链接见一切的外部环境,但
外部环境不能接见内部环境中的任何变量和函数。这些环境之间的联络是线性、有序次的。每一个环境都
能够向上搜刮作用域链,以查询变量和函数名;但任何环境都不能经由过程向下搜刮作用域链而进入另一个
实行环境。关于这个例子中的 swapColors() 而言,其作用域链中包括 3 个对象: swapColors() 的变量对象、 changeColor() 的变量对象和全局变量对象。 swapColors() 的部分环境最先时会先在本身的变量对象中搜刮变量和函数名,假如搜刮不到则再搜刮上一级作用域链。 changeColor() 的作用域链中只包括两个对象:它本身的变量对象和全局变量对象。这也就是说,它不能接见swapColors() 的环境。

函数参数也被看成变量来看待,因而其接见划定规矩与实行环境中的其他变量雷同。

    原文作者:gecko23
    原文地址: https://segmentfault.com/a/1190000000725378
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞