您的位置:首页 > Web前端 > JavaScript

js高级——作用域链

2017-12-28 07:54 176 查看
1.作用域链:只有函数可以制造作用域结构,所以只要是代码就至少有一个作用域(即全局作用域)
(1)凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域。将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构,就称作作用域链
(2)只要是函数就可以创造作用域
        函数中又可以再创建函数
        函数内部的作用域可以访问函数外部的作用域
        如果有多个函数嵌套,那么就会构成一个链式访问结构  -->  作用域链
    //f1 --> 全局
    function
f1(){
        //f2 --> f1 --> 全局
        function
f2(){
            //f3 --> f2 --> f1 --> 全局
            function
f3(){

            }
            //f4 --> f2 --> f1 --> 全局
            function
f4(){

            }
        }
        //f5 --> f1 --> 全局
        function
f5(){

        }
    }

2.绘制作用域链图

function
f1(){
    function
f2(){

    }

}

var
num =
456 ;
function
f3(){
    function
f4(){
    }
}

(1)绘制作用域链的步骤

    ·看整个全局是一条链,即顶级连,记为0链

    ·看全局作用域中有什么变量和函数声明就以方格的形式绘制到0级链上

    ·再找函数,只有函数可以限制作用域,因此从函数中引入新链,标记为1级链

    ·然后在每一个1级链中再次往复以上的行为

(2)变量的访问规则

    ·首先看变量在第几条链上,在该链上看是否有变量的定义与赋值,如果有就直接使用

    ·如果没有到上一级链上找(n - 1级链),如果有就直接用,停止继续查找

    ·如果还没有再次网上查找,知道全局链(0级),如果还是没有就是is not defined

    ·注意:同级的链不可混合查找

3.注意点
(1)并不是在函数内部写了变量,这个变量就属于这个函数的作用域,而是必须使用var关键字来声明该变量,这个变量才会属于这个作用域
(2)声明函数时的函数名,其实也是一个变量名,可以通过这个变量名来给其赋值(不管是赋什么值)
(3)函数在声明出来的时候,里面的代码不会执行,只有在调用的时候代码才会执行
(4)变量搜索原则

        ·首选在当前链上找

            ·如果有,就停止查找

            ·如果没有,就在n-1级上查找(在函数内部允许访问定义在函数外部的变量)

        ·如此循环往复直到0级链

            ·如果找到,就结束查找,直接获得该链上变量的数据

            ·如果还没有就抛出异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: