http://www.cnblogs.com/HPNiuYear/archive/2012/08/27/2657879.html
JavaScript解析机制是什么?
JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段。
* 编译阶段
编译阶段就是我们常说的JavaScript预解析(预处理)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码。
* 执行阶段
在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并顺序执行。
编译阶段(预解析阶段)做什么操作?
* var , function声明的变量提升
<script>
alert(a);
if(false){
var a=10
}
</script>
结果显示为undefined,我理解为在运行前,首先将var声明的变量进行声明,并赋值undefined,所以即使运行时还未声明,但是该变量已经存在。
<script>
AA()
function AA(){
alert(a)
var a=10
}
</script>
结果为undefined,function声明的函数在运行前会被设置为活动对象的属性(我的理解就是预先加载生成了),所以在运行到声明语句之前便可以调用,
但是函数中声明的变量还是为被赋值,依然是undefined。
* 函数声明与函数表达式在预解析的区别
<script>
AA()
var AA=function() {}
</script>
结果报错Object expected. 这段不是很懂,理解为var 和 function 两种在与解析的时候会有冲突,var将变量定义为了undefined所以再指向function时会报错。
* function 覆盖
<script>
AA()
function AA(){
alert(1)
}
function AA(){
alert(2)
}
</script>
结果为2,同名function,在与解析时最后一个有效。
* 预解析把变量或函数解析到其运行时的环境中
<script>
aa="out function"
function AA(){
alert(aa)
var aa = "in function"
alert(aa)
}
</script>
结果第一个为undefined 第二个为in function 。我的理解为这样的原因是变量查找的就近原则,而不是预解析的原因。
* JavaScript“预解析”分段进行
<script>
AA()
function AA(){
alert(1)
}
</script>
<script>
function AA(){
alert(2)
}
</script>
结果为1,function函数的声明是分块的,不同块之间不影响,而var变量不分。
* var 变量提升以及 function 函数声明提升
该点是对函数声明以及函数表达式进一步的说明,其实前面函数声明和函数表达式在预解析的不同表现,其主要的原因就是 var 和 function 两者不同的提升。这个问题从解析阶段到运行阶段来说明。首先,在解析阶段 var 后面的 AA 会被提升然后 AA 被定义为undefined,BB 也会被提升,而BB被提升后的内容就是整个 function 里面的内容,其实从浏览器的控制台我们可以看出一二。然后,整个解析过程完了就到了运行阶段,在运行阶段期间,当读到 AA() 的时候,其实就是将 AA 这个变量指向function(){}这个函数然后调用,而到了 BB() 的时候,就会从之前声明的函数中去查找该早已经声明的函数,然后直接调用。