javascript代码执行顺序易错点

使用过javascript都知道,它是一种解释型语言,在浏览器中从上往下解释执行。但是否真的是完 全的从上往下执行的呢?其实这种说
法是不严谨的,下面有两个简单的代码示例:
 
示例一:
<html>
 <head>
  <script type="text/javascript">
   testOne();
   function testOne(){
    alert("Hi");
   }
  </script>
 </head>
 <body>
 </body>
</html>
    在浏览器中运行这段代码,可能不少人都会认为这段代码会出现错误,因为javascript是从上往下
 
执行的,当执行testOne()的时候,方法testOne()还没有定义,在实际的开发过程中也确实可能会碰到
 
这样的错误,当需要获得某个HTML标签的DOM对象时,由于标签还没有加载完毕而出现错误。但是此处并
 
非如此,代码正确的执行了,界面上弹出对话框,显示“Hi”
 
示例二:
<html>
 <head>
  <script type="text/javascript">
   function testOne(){
    alert("Hi");
   }
   testOne();
   function testOne()
   {
    alert("Hello");
   }
  </script>
 </head>
 <body>
 </body>
</html>
    当执行这段代码时,弹出的对话框显示的信息是“Hello”,而并非是“Hi”。按照javascript代码
 
从上到下依次执行的原则来说,应该是“Hi”,而不是“Hello”,那这是为什么呢?(在此简单的提一
 
下,可能有人会认为声明两个同名方法会出现错误,在C#、java等语言中的确无法声明两个同名方法,
 
但是javascript中可以这么声明,后声明的方法定义会将先声明的方法定义覆盖)
 
    出现以上情况的原因就是如我一开始所说的,“javascript是从上往下执行”这句话是不严谨的,
 
javascript并非是完全的从上往下执行,其中还有代码优先的问题。规则是方法的声明会先执行,然后
 
才会执行变量的赋值、方法的调用等其它代码,不论方法声明是写在其它代码前面,还是后面,都会先
 
执行,当然在这当中,是遵循从上到下执行的原则,写在前面的方法声明先执行,写在后面的就后执行
 
,其它代码也是如此。所以在示例一中,虽然testOne方法的调用写在了他声明代码的前面,但由于声明
 
代码是先执行的,所以这里不会出错,能够打印出“Hi”;示例二中testOne方法声明了两次 ,这两次都
 
会先于方法的调用而执行,并且由于是同名,第二次会覆盖第一次的方法定义,所以结果不是“Hi”,而
 
是“Hello”。
    为了大家能够更好的理解,再看一下第三个简单示例:
示例三:
<html>
 <head>
  <script type="text/javascript">
   var test=function testOne(){
    alert("Hi");
   }
   test();
   var test=function testOne()
   {
    alert("Hello");
   }
  </script>
 </head>
 <body>
 </body>
</html>
    这这段代码中输出的结果就是Hi,而不是Hello,因为此时是通过一个指向了方法的变量来调用方法,
 
方法的声明虽然先执行了,但是变量的赋值、以及方法的调用等代码是按照从上往下的规则来执行的,
 
当执行test()的时候,只把输出“Hi”的方法赋值给了test变量,所以输出的结果是“Hi”。
原文地址:https://www.cnblogs.com/zhouyifengNET/p/3051234.html