javascript代码实例教程-JavaScript作用域原理(一)――作用域链

发布时间:2019-01-24 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-JavaScript作用域原理(一)――作用域链脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 一、作用域的描述

 

JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。”

 

在JavaScript中,作用域的概念和其他语言差不多,在每次调用一个函数的时候,就会进入一个函数内的作用域,当从函数返回以后,就返回调用前的作用域。

 

 

 

验证下刚那句权威指南中的话:

 

<p id="scoPE1" style="color:red"></p>

复制代码

     function echo(p, htML) {

            p.innerHTML += html + &#39;<br/>';

        }

        //1、

        VAR posITion = 'out';

        var pscope1 = document.getElementById('scope1');

        function scope1() {

            echo(pscope1, position);

        }

        function set1() {

            var position = 'in';

            scope1();

        }

        set1();

复制代码

1、变量scope1定位到一个p标签,用于打印信息的显示

 

2、echo是一个自定义的函数,用于打印信息,形参一个是p标签,一个是需要打印的信息内容

 

3、最后打印出的是“out”,由于打印操作在scope1函数中,scope1中没有变量position,只能往外一层的作用域中查找,作用域关系如下图所示:

 

 

 

4、调用set1的作用域链大致样子如下:

 

 

 

 

 

二、作用域的实现

 

作用域的实现,并非用“堆栈”方式,而是使用列表,ECMA262中所述如下:

 

任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现

 

在一个函数被定义的时候, 会将它定义时刻的scope chain链接到这个函数对象的[[scope]]属性

 

在一个函数对象被调用的时候,会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参,都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中

 

 

 

再来看下两个实例,练练手:

 

复制代码

     function function1() {

            var x = 'in function1';

            function inner1() {

                x = 'in inner1'; //没有加var,等同于在外面这个函数中做声明

            }

            inner1();

            echo(pscope1, x);

        }

        function1();

复制代码

最终打印出来的结果是“in inner1”

 

 

 

复制代码

     function function2() {

            var x = 'in function2';

            function inner2() {

                echo(pscope1, x); 

                var x = 'in inner2'; //加var

                echo(pscope1, x); 

            }

            inner2();

        echo(pscope1, x);

        }

        function2();

复制代码

第一个echo将打印出“undefined”,第二个echo打印出“in inner2”,第三个echo打印出“in function2”。

 

上面的inner2等同于下面的代码:

 

        function inner2() {

                var x

                echo(pscope1, x); //这个时候x还未定义

                x = 'in inner2'; 

                echo(pscope1, x); 

            }

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-JavaScript作用域原理(一)――作用域链全部内容,希望文章能够帮你解决javascript代码实例教程-JavaScript作用域原理(一)――作用域链所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。