凡是使用function FunctionName(){}这种方式定义的函数,浏览器会预先把他们提取出来分析,然后再执行其他的代码。
当你定义了两个相同的函数时,后面的会覆盖前面的。
详细如下(为了方便说明,我加了行号):
<script>
1 function A(){alert(1);}
2 A();
3 function A(){alert(2);}
4 A();
5 A = function(){alert(3);}
6 A();
</script>
执行的顺序:
1行 >> 3行 >> 2行 >> 4行 >> 5行 >> 6行;
因为浏览器会预先执行function ***(){};这样的代码。所以执行完第一行就继续寻找类似“function ***(){};”这样结构的代码,因此上例就跳过第二行执先行了第三行,当执行完第三行时,第一行定义的function A已经被第三行覆盖。而第5行虽然A的值是一个函数,但是它是以变量的形式声明的,因此不会被预先执行。也就是说只有以function关键字开头声明的函数会被预先执行。
这 就是JavaScript执 行顺序导致的。JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。而且在分析执行同一段 代码中,定义式的函数语句会被提取出来优先执行。函数定义执行完后,才会按顺序执行其他代码。也就是说,在第一次调用hello函数之前,第一个函数语句 定义的代码已经被第二个函数定义语句的代码覆盖了,这就是为什么在例子2中第一次调用hallo时,也会输出后面定义的函数内容的原因了。
以上是正常情况。
如果涉及到Ajax请求,你得设置同步的属性,才能保证语句可以顺序(同步)执行。
比较详细的好文章:
http://blog.csdn.net/a7458969/article/details/6328751
看完之后,知道了js的预编译和执行阶段的概念,真是一篇很不错的文章。
最后还提到了用document.write导入js时可能产生的浏览器兼容问题以及解决办法。可惜对这种用法不熟,没看懂。