昨天在论坛上面看到这么一个帖子《回答得了分数拿去,考js基础》;于是乎看到这样的一道题
<script>
var aa="aa";
function test()
{
alert(aa);
var aa='bb';
alert(aa);
}
test();
</scirpt>
我给出的结果是 aa bb,觉得在test()执行的时候,应该会顺着作用域链的问题 找到window下的aa,输出 aa,然后执行了 var aa=‘bb’;之后再执行alert(aa);的时候就应该是输出‘bb’了,正常的答案是 undefinded bb;再了解原因的时候,了解到了 是“js预编译”作祟
以下内容来自http://blog.sina.com.cn/s/blog_655388ed01013gec.html
function mm(){ }
这种形式是声明一个函数,跟 var 一个变量的机制一样,脚本在解释执行之前会做预编译处理,而
var mm = function(){ }
这种形式是对一个变量赋值,虽然也做预编译,但仅仅只是给 mm 事先变量分配一个内存空间,而没有做初始化
请测试以下几段代码
代码一:
<script type="text/javascript">
window.alert(mm);
function mm(){
}
</script>
以上代码你会看到能 alert 出来 mm 的内容,但 alert 却是在 function 声明之前的,验证了脚本宿主在执行之前对脚本做了预编译处理
代码二:
<script type="text/javascript">
window.alert(mm);
var mm = 123;
</script>
以上代码你会看到 alert 出一个 undefined 来,说明脚本宿主在执行之前对脚本做了预编译:对 mm 分配内存空间但并不初始化它
代码三:
<script type="text/javascript">
window.alert(nn);
window.alert(aa);
if(true){
}else{
}
</script>
以上代码再次验证了预编译,并且说明预编译与条件无关。先弹出nn的函数定义,再弹出undefined。上面这一句其实在不同浏览器下,效果是不一样的。
在火狐下面 会报错 nn未定义 不排除高版本的修正过来,在chrome 和 ie下确实是先弹出nn的函数定义再弹出undefined。
<script>
</script>
执行结果是"function"和"variable"。
JS解析器先预定义了 addB 变量为 undefined, 但是 addB 函数覆盖了此变量,因此一开始执行结果是 function,然后 addB 被赋值为 "variable",因此最后执行结果是 "variable",上面的代码即使变为
<script>
</script>
结果也一样,这说明JS解析器先预声明变量,再预定义函数 。
小结一下:JS 在执行前会进行类似"预编译"的操作,而且先预定义变量再预定义函数。