javascript的执行顺序

先看下面两段js程序,先是定义式函数写法:

复制代码

  • <script type="text/javascript">
  • function myfunc(){
  • alert("第一次调用");
  • };
  • myfunc(); //得出的是 第二次调用
  • function myfunc() {
  • alert("第二次调用");
  • };
  • myfunc(); //得出的是 第二次调用
  • </script>

接下来是变量式函数写法:

复制代码

  • <script type="text/javascript">
  • var myfunc = function (){
  • alert("第一次调用");
  • };
  • myfunc(); //得出的是 第一次调用
  • myfunc = function () {
  • alert("第二次调用");
  • };
  • myfunc(); //得出的是 第二次调用
  • </script>

在定义式函数写法的代码中执行两个方法后的结果是一样的,就等于定义式函数中第一个函数没起到任何作用,得到的都是第二个函数的结果,从结果来看,JavaScript执行顺序不是按顺序一条一条来执行。

在变量式函数写法的代码中执行两个方法后的结果是不同的,从这来看,JavaScript执行顺序是按顺序一条一条来执行的,

从这两个不同函数的表示方法来看,在同一段程序的分析执行中,定义式函数有优先权,定义式函数执行完后,其他语句(包括变量式函数)才顺序执行,那么下面的例子也就不难得出结果了:

复制代码

  • <script type="text/javascript">
  • function myfunc(){
  • alert("第一次调用");
  • };
  • myfunc(); //输出 第二次调用
  • var myfunc = function (){
  • alert("第三次调用");
  • }
  • myfunc();//输出 第三次调用 上次的结果已经被这次的变量式函数结果覆盖
  • function myfunc() {
  • alert("第二次调用");
  • };
  • myfunc();//输出 第三次调用 function myfunc()已经不再执行
  • myfunc = function () {
  • alert("第四次调用");
  • }
  • myfunc();//输出 第四次调用
  • </script>

结果就不像我们上次分析的那样了,这里的改变就是把两个相同的方法放在两个JavaScript片段里,这时两个方法都得出各自的结果,这里也就说明JavaScript是按一段一段来分析执行的,如下面代码:

复制代码

  • <script type="text/javascript">
  • myfunc();//输出 第一次调用
  • var myfunc = function (){
  • alert("第二次调用");
  • }
  • myfunc();//输出 第二次调用
  • function myfunc() {
  • alert("第一次调用");
  • };
  • </script>
  • <script type="text/javascript">
  • myfunc();//输出 第三次调用
  • var myfunc = function (){
  • alert("第四次调用");
  • }
  • myfunc();//输出 第四次调用
  • function myfunc() {
  • alert("第三次调用");
  • };
  • myfunc();//输出 第四次调用
  • </script>

贴内牛人总结:

1、<script>中的代码是阻塞式同步下载执行的,当浏览器遇到一个<script>标签会先下载这个标签的代码然后执行。在完成这件事之前不会加载其他任何标签和资源。

2、变量和函数的声明发生在代码解析期,但是,变量赋值发生在运行期,因此反复声明同名函数和变量,最后一次声明的函数被保存下来,直到运行到变量赋值的代码才发生变化。