JS全局与局部作用域解析、作用域链(上)
2021-04-25 08:27
标签:实例 cti efi var 读取 函数声明 注意 解析 bsp 讲解实例3: alert(a); var a = 1; alert(a); function a(){alert(2);} alert(a); var a =3; alert(a); function a(){alert(4);} alert(a); a(); 结果看得出来吗? 揭晓结果,依次是: function a(){alert(4);} 1 1 3 3 报错:a is not a function 详解: 预解析阶段:根据var function 参数……等来找东西 首先,a=undefined; 其次,a=function a(){alert(2);}; //覆盖掉前面的:a=undefined; ---注意:遇到重名的,只留下一个;变量和函数重名,就只留下函数;--- 再次,a=undefined; //与函数重名,只留下一个,a依然等于function a(){alert(2);} 最后,a= function a(){alert(4);}//覆盖掉前面的:a=function a(){alert(2);} ;此时a=function a(){alert(4);} 因此,预解析完毕时:a = function a(){alert(4);} 逐行解读代码:每次读取的时候,都是先去找仓库里面的东西 第一个alert(a); 弹出:function a(){alert(4);} 下一行 var a = 1 ,这是个表达式,它能修改预解析后仓库里面的值; 因此执行var a =1之后;a= functioni a(){alert(4);} 将被修改为 a = 1 第二个alert(a); 弹出:1 再下一行 function a(){alert(2);},这是个函数声明,不是表达式;所以,它不会改变仓库里面的任何东西;(a依然等于1) 于是,继续往下读; 第三个alert(a); 弹出: 1 接下来 var a = 3又是个表达式,于是执行之后,仓库里的“a = 1” 又将会被更改为“a = 3”; 第四个alert(a); 弹出:3 接下来又遇到一个函数声明:function a(){alert(4);},函数声明不会去改变仓库里面的值,因此a 依然等于3; 第五个alert(a); 弹出:3 最后的a(); 看起来是个函数调用,但是要注意:你所看到的代码,并不是JS解析器看到的代码【此时我们的JS解析器中唯一有的东西就是 "a = 3",但是已经没有任何的函数了 】 那么这时的a(); 就相当于3(); //这个语法是ECMAscript 不支持的;这时会报错:a is not a function; JS全局与局部作用域解析、作用域链(上) 标签:实例 cti efi var 读取 函数声明 注意 解析 bsp 原文地址:https://www.cnblogs.com/tongguilin/p/12229885.html
文章标题:JS全局与局部作用域解析、作用域链(上)
文章链接:http://soscw.com/index.php/essay/79327.html