美文网首页
作用域链

作用域链

作者: __jy | 来源:发表于2019-02-11 15:11 被阅读0次

    1、什么是作用域链?

    JavaScript中,JavaScript里一切都是对象,包括函数。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是作用域,包含了函数被创建的作用域中对象的集合,称为函数的作用域链。

    作用域(scope)

    通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。

    作用域链作用(scope chain)

    作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。

    var color = "blue";
    function changeColor(){
     if (color === "blue"){
     color = "red";
     } else {
     color = "blue";
     }
    }
    changeColor();
    alert("Color is now " + color); 
    

    在这个简单的例子中,函数 changeColor()的作用域链包含两个对象:它自己的变量对象(其中定义着 arguments 对象)和全局环境的变量对象。可以在函数内部访问变量 color,就是因为可以在这个作用域链中找到它。

    此外,在局部作用域中定义的变量可以在局部环境中与全局变量互换使用,如下面这个例子所示

    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()内部则可以访问其他两个环境中的所有变量,因为那两个环境是它的父执行环境。
    下图形象地展示了前面这个例子的作用域链。


    image.png

    图中的矩形表示特定的执行环境。其中,内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性、有次序的。

    每个环境都可以向上搜索作用域链,以查询变量和函数名;但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。对于这个例子中的 swapColors()而言,其作用域链中包含 3 个对象:swapColors()的变
    量对象、changeColor()的变量对象和全局变量对象。swapColors()的局部环境开始时会先在自己的变量对象中搜索变量和函数名,

    如果搜索不到则再搜索上一级作用域链。changeColor()的作用域链中只包含两个对象:它自己的变量对象和全局变量对象。这也就是说,它不能访问 swapColors()的环境。

    (参考阅读《JS高级程序设计》这本书)

    相关文章

      网友评论

          本文标题:作用域链

          本文链接:https://www.haomeiwen.com/subject/ejjqeqtx.html