学习笔记:视频2-JS全局与局部作用域解析、作用域链(上)

接上篇 学习笔记:视频1-JS作用域概念-预解析规则、表达式、声明、闭包;

 

讲解实例3:

<script>

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();

</script>

结果看得出来吗?

揭晓结果,依次是:

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;

===============================================================================================

下一篇:学习笔记:视频2-JS全局与局部作用域解析、作用域链(下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值