先看代码:
<script>
alert( typeof vv);
var vv= "variable" ;
function vv() {
alert( "function vv" );
}
alert(vv);
</script>
执行结果是”function”和”variable”。
照理说,一开始,vv有变量声明,有vv函数的函数声明,但vv的函数声明覆盖了变量声明,所以typeof vv为 function.
然后vv被赋值为”variable”。所以,后面一个alert(vv)的结果为:variable。
但当上面的代码变为:
<script>
alert( typeof vv);
function vv() {
alert( "function vv" );
}
var vv= "variable" ;
alert(vv);
</script>
执行结果也一样,这就有蹊跷了!!!说明了,JS解析器是:先预声明变量,再预定义函数 的。
小结一下:JS 在执行前会进行类似”预编译”的操作,而且先预定义变量再预定义函数。