美文网首页
作用域、执行环境、作用域链

作用域、执行环境、作用域链

作者: wade3po | 来源:发表于2019-02-06 08:53 被阅读18次

    作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域。因为有函数作用域,所以我们有全局作用域和局部作用域的说法。

    执行环境是什么?执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的虚拟的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

    简单说就是每一个函数就有一个执行环境,函数里面的变量和函数都要通过这个函数去访问。对于外部环境来说,每一个函数也是一个变量对象。每一个函数都有一个初始化的argument变量。

    JavaScript中最大的全局执行环境是window,执行环境要在所有代码执行完毕才会被销毁,而全局执行环境window只有关闭网页或者关闭浏览器才被销毁。

    当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。

    讲的有点抽象了,通过代码或许更直观:

    <script>
        var a = 5;
        function fun1() {
            console.log(arguments)
        }
    </script>
    

    全局作用域window,局部作用域fun1,;全局执行环境window,局部执行环境fun1;window有自己的变量对象,就是window本身,window可以通过这个变量对象去访问变量a和变量对象fun1。

    当fun1执行的时候创建了一个作用域链,所以fun1有两个变量对象,一个是自己,一个是全局环境的变量对象window。fun1可以在函数内部访问变量a,因为fun1所在的作用域链可以找到变量a。

    再比如:

    var a = 5;
    function fun1() {
        var b = 6;
        function fun2() {
            var c = 7;
        }
    }
    

    这段代码有三个执行环境:全局环境window、局部环境fun1、局部环境fun2;

    全局环境Window有一个变量a和一个函数fun1;

    局部环境fun1有一个变量b和一个函数fun2,但是fun1可以访问全局环境的变量a;

    局部环境fun2有一个变量c,但是fun2可以访问fun1环境中的变量b和全局环境的变量a;

    这就是作用域链,作用域链中的内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。作用域链中,每一个局部环境都会首先寻找自身环境中的属性和方法,搜索到了就停止寻找,没有找到再向上搜索直到最外层window还搜索不到就报错。

    欢迎关注Coding个人笔记 公众号

    相关文章

      网友评论

          本文标题:作用域、执行环境、作用域链

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