理解javascript作用域和作用域链

页面导航:首页 > 网络编程 > JavaScript > 理解javascript作用域和作用域链

理解javascript作用域和作用域链

来源: 作者: 时间:2016-02-20 09:49 【

作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。 全局和局部作用域下面用一张图来解释:

作用域

作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域。

全局和局部作用域下面用一张图来解释:

\

单纯的JavaScript作用域还是很好理解的。<喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgPC9wPgo8cD48YnI+CjwvcD4KPGgxPiAgINf308PT8sG0PC9oMT4KPHA+ICDIq77W1rTQ0Lu3vrPKx9fuzeKy47XE0ru49ta00NC7t76zo6zU2ndlYuSvwMDG99bQyKu+1ta00NC7t76zysd3aW5kb3e21M/zo6zS8rTLy/nT0Mirvtax5MG/us26r8r9trzKx9f3zqp3aW5kb3e21M/ztcTK9NDUus23xbTztLS9qLXEoaPDv7j2uq/K/ba809DX1Ly6tcTWtNDQu7e+s6OstbHWtNDQwfe9+Mjr0ru49rqvyv21xMqxuvKjrLqvyv21xLu3vrO74bG7zcbI69K7uPa6r8r91bvW0KOstvjU2rqvyv3WtNDQzeqxz7rz1rTQ0Lu3vrOz9tW7sqKxu8/6u9mjrLGjtObU2sbk1tC1xMv509Cx5MG/us26r8r9tqjS5cvm1q7P+rvZo6y/2NbGyKi3tbvYtb3WrsewtcTWtNDQu7e+s9bQo6zIq77WtcTWtNDQu7e+s9Ta06bTw7PM0PLNy7P2o6jkr8DAxve52LHVo6myxbvhsbvP+rvZoaMKPC9wPgo8cD4gILWxtPrC69Ta0ru49ru3vrPW0Na00NDKsaOsu+G0tL2oseTBv7bUz/O1xNK7uPbX99PD0/LBtKOoc2NvcGUgY2hhaW6jqcC0saPWpLbU1rTQ0Lu3vrPT0Miot8POyrXEseTBv7rNuq/K/bXE09DQ8rfDzsqhozwvcD4KPHA+ICAgINPD0rvVxc28wLS94srN1/fTw9PywbS1xNTL0NCjutPJwO/P8s3i1rTQ0KGjPC9wPgo8cD4gICAgPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141030/20141030090737181.jpg" alt="\">

当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充,例如定义下面这样一个函数:

function add(num1,num2) {
    var sum = num1 + num2;
    return sum;
}
在函数add创建时,它的作用域链中会填入一个全局对象,该对象包含了所有全局变量,如下图所示:

\


函数add的作用域将会在执行时候用到,例如执行如下代码:

function a(sum1,sum2){
            var sum=num1+num2;
            return sum;
        }
        var tatal=a(5,10);
执行此函数时会创建一个称为“运行期上下文(execution context)”的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。   

这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链中。它们共同组成了一个新的对象,叫“活动对象(activation object)”,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图所示:

\

在函数执行过程中,没遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。


总结

根据上述讲的作用域链的结构可以看出,定义的标识符的越深,那么读写的速度也就越慢,而全局变量总是处于作用域链的最末端,所以当变量解析的时候,查找全局变量是最慢的,所以在编写代码的时候要尽可能少的使用全局变量,尽可能使用局部变量。

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<