<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
Fn(); //浏览器报错:"undefined"
</script>
<script type="text/javascript">
function Fn(){ //函数1
alert("执行了函数1");
}
</script>
</body>
</html>
为什么运行上面的代码浏览器会报错呢?声明函数不是会在预处理期就会被处理了吗,怎么还会找不到Fn()函数呢?其实这是一个理解误点,我们上面说了JS引擎是按照代码块来顺序执行的,其实完整的说应该是按照代码块来进行预处理和执行的,也就是说预处理的只是执行到的代码块的声明函数和变量,而对于还未加载的代码块,是没法进行预处理的,这也是边编译边处理的核心所在。
这里才是重点!!!
上面写了一大堆,也就是说,JS在加载的时候会按顺序加载script标签元素中的代码块,对于这些代码块,用类似于function xxx(){}这种方式声明的function会在该script中被优先加载,相当于把这种function的声明提到了该script中的最前面。