挖掘javascript高级属性——预解析

javascript的执行过程分为两个阶段:

1.进入执行上下文(预解析[hoisting]);
2.执行代码;

“预解析”:JavaScript引擎会优先解析var变量和function定义。在预解析完成后,才会执行代码


先看两段代码,例1-1:


var a = 1;
function fun(){
    alert(a);
    var a = 2;
}
a = 10;
fun();

执行结果是(点击查看): 

例1-2:


if (!("a" in window)) {
    var a = 1;
}
alert(a);

执行结果是(点击查看): 

这两个问题如果你都答对了,我相信你至少已经对js执行过程有所了解。

既然我们了解了它的执行过程是:先预解析,再执行。预解析时,搜索当前作用域内变量定义(variable declaration)和函数定义(function declaratioin),再执行代码。我们再看看关于预解析的例子.

例1-3:


<script type="text/javascript">
fun();
function fun(){
    alert('fun 1');
}
function fun(){
    alert('fun 2');
}
</script>

执行结果是(点击查看): 

例1-4:


<script type="text/javascript">
fun();
function fun(){
    alert('fun 1');
}
function fun(){
    alert('fun 2');
}
</script>
<script type="text/javascript">
function fun(){
    alert('fun 3');
}
</script>

执行结果是(点击查看): 

 

为什么?为什么都是fun 2,要说1-3是fun2 还能理解,因为js存在预解析,后面定义的function把前面定义的给覆盖了。至于1-4为什么会这样。其实在预解析时,js的块(一对script标签为一块)之间不会变量覆盖。

 

引用:

js中函数预解析在Firefox下的异常表现

变量对象(Variable object)

posted @   nodejs  阅读(138)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示