首页 > 网站 > WEB开发 > 正文

JS作用域与作用域链详解

2024-04-27 15:06:56
字体:
来源:转载
供稿:网友

变量必须先声明后使用,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声明的变量就是局部变量。

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表