javascript的执行环境及作用域(一)

来源:互联网 发布:地狱解剖知乎 编辑:程序博客网 时间:2024/06/07 13:59



废话:我想作为一个还没有工作的前端开发人员,应该学习一些使用Mark'Down进行博客的编写了,如果你们和我一样,我也建议进行这样的学习,然后我相信肯定会在写README的时候,得心应手。(BestWishes)(最近有想建立一个社区的想法,还不知道怎么实施起来比较好 






写在前面:该文章主要参考《javascript高级程序设计(第三版)》。
正文:


执行环境是javascript中的最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了他们的各自行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
某个执行环境中所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数的定义也随之销毁。(全局执行环境直到应用程序退出时才会被销毁)。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返还给之前的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有便变量和函数的有序访问。
好了这么一大段的概念应该要理解好半天了吧,还是实践出真知吧。


标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域的前端开始,然后逐级的向后回溯,直至找到标识符为止。(如果找不到标识符,通常会导致错误的发生)。


var color='blue';
        function changeColor() {
            if(color=='blue'){
                color='red'
            }else{
                color='blue'
            }
        }
        changeColor();
        console.log(color);






那么输出的结果是red。这个简单的粒子例子中,函数changeColor()的作用域链包含两个对象:他自己的变量对象和全局环境的变量对象。函数可以在内部进行访问是因为可以在这个作用域中找到他。


在局部的作用域中定义的变量可以在局部环境中与全局变量互相使用,




var color='blue';
        function changColor() {
            var anotherColor='red';
            function swapColor() {
                var tempColor=anotherColor;
                anotherColor=color;
                color=tempColor;
            }
            swapColor();
//无法访问tempColor
        }
        changColor();
        console.log(color);


输出的color也是red。上面的代码涉及3个执行环境:changColor();swapColor();全局环境。


进行总结:内部环境可以通过作用域链访问外部环境,但是外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的,有次序的,每个环境都可以向上


搜索作用域,以查询变量和函数名;但任何环境都不能通过向下搜索作用域而进入另一个执行环境。

原创粉丝点击