JS作用域与作用域链详解

来源:互联网 发布:php使用zerozmq 编辑:程序博客网 时间:2024/04/27 23:10

变量必须先声明后使用,js中函数可以先使用后声明是因为函数有预加载过程!

作用域链

内部环境可以访问外部环境的变量,反之不然
环境:每个函数内部都是一个环境,最外边是全局环境。
两种类型:函数环境、全局环境

变量的作用域是声明时决定的,而不是运行时

<script>var ip="127";function f1(){    console.log("ip地址:"+ip);}function f2(){    var ip="192";    f1();}f2();   //ip地址:127</script><script>//再写一个分析function n1(){    var ip="127";    console.log("ip地址:"+ip);}function n2(){    var ip="192";    n1();}n2();   //ip地址:127</script>

访问是系统唯一变量, 调用时取决于变量的当时信息

<script>var ip="127";function s1(){    console.log("ip地址:"+ip);}s1();       //ip地址:127var ip="192";s1();       //ip地址:192</script>

AO活动对象

AO: Active Object 活动对象(抽象的)

执行环境:
js代码执行是有环境的(全局环境、函数内部环境)
环境定义了其有权访问的其他数据
环境有一个与之关联的“活动对象AO”
环境中所有的变量和函数都是活动对象AO的成员
全局环境是最外围的执行环境,活动对象是window对象
执行环境中的代码执行完毕后就被销毁

图解:
AO活动对象
每个环境都通过AO定义了其权访问的一些数据。

<script>    var weather = "rain";        var week = "Thurday";        var date = "0910";        console.log("now:"+window.weather);        function f1(){            console.log("f1:"+weather);            function f2(){                var weather = "snow";                var subject = "php language";                console.log("f2:"+weather);                function f3(){                    var week = "Sunday";                    console.log("f3:"+weather+"--星期:"+week+'--日期:'+date+'--科目:'+subject);                }                f3();            }            f2();        }        window.f1();/*now:rainf1:rainf2:snowf3:snow--星期:Sunday--日期:0910--科目:php language*/</script>

以上程序代码分析
在f3最里边环境获得一个变量信息:
首先在本环境获得,如果没有
其次像外部环境获得
其次再像外部环境获得
…..
直到找到全局环境为止
通过以上分析,变量寻找看似一个“动态过程”,实际其是一个”固态过程”
每个环境都有AO活动对象
每个环境可以访问的信息早早地已经“固化”为AO的成员信息

变量的类型及访问优先顺序

四种类型:内部变量>>>内部函数>>>形参>>>外部变量(变量/函数/形参)
同名的变量和函数同时存在,”变量”会”覆盖”函数

<script>var yuyan = "php";                 //①外部变量function f1(){    function f2(yuyan){            //②形参        var yuyan = "html";       //④内部变量        console.log('语言:'+yuyan);            function yuyan(){    //③内部函数                    console.log('very good');                }     }            f2('java');}f1();       //语言:html</script>

全局和局部变量

全局变量
声明:
① 在函数外部声明的变量
② 在函数内部不使用var声明的变量(前提是函数执行之后才起作用)

全局变量 是活动对象window的成员信息。
在访问的时候,window是否设置都可以,如果设置window可以提高代码可读性

局部变量
声明:
在函数内部通过var声明的变量就是局部变量。

局部变量 相对概念上,在一定范围内可以看做是“全局变量”。
其在 本环境、内部环境、内部深层环境 都可以被访问。

0 0