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 在执行前会进行类似"预编译"的操作,而且先预定义变量再预定义函数。
最近重新学习JS,其实还是很有意思的!