紧接着上篇文章,在上篇的基础上来做一个变形。
变形一
先看一下下面的Demo
<span style="font-family:SimSun;font-size:18px;"><script> var a = 1; function fn1() { alert(a); a = 2; } function fn1(a){ alert(a); a = 2; } fn1(); alert(a); var a = 1; function fn1(a){ alert(a); a = 2; } fn1(); alert(a); </script></span>
代码分析
看了一下上述代码,有木有另外一种晕头转向的感觉,这又是何方神圣,看不懂哈!没事,慢慢的来分析。
还是按照我上篇博客提到的分析的几个步骤,来分析一下。
1.找点玩意
在浏览器中解析预先解析的时候,就是先找一些var、function的东西,然后经过PK后放置到一个仓库里面。并且PK的等级是 var——function function(先来)——function(后来)。经过PK后,仓库中放置的东西如下:
2.逐行解读代码
经过JS的预解析后,开始从上至下执行代码,当执行到fn1()码的时候,怪异的事情出现了,因为fn1()是调用函数块,所以又开始了上述的两个过程,解析——解读,好了经过解读后,看看仓库中有什么样的变化。
为何会又多出一个a呢?在这次解析中,并没有发现var的出现啊,a前面并没有哈,为何会多出来一个a呢?大家不要忘了,在解析fn1(a)的时候,其中的a就相当于fn1(var a),所以问题就在这里,在此就多出来一个var的效果,所以才会出现上述的结果。
3.在此执行解析出来的代码
所以当执行alert(a)时,因为在当初解析的时候赋值为undefined,所以会弹出undefined的窗口。
执行完后的结果如下
接下向下执行,alert(a),这时候就知道记过了吧!弹出的肯定是1哈。
未完待续
时间: 2024-11-05 02:18:47