凡是使用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请求,你得设置同步的属性,才能保证语句能够顺序(同步)执行。url
http://blog.csdn.net/a7458969/article/details/6328751.net
看完以后,知道了js的预编译和执行阶段的概念,真是一篇很不错的文章。code
最后还提到了用document.write导入js时可能产生的浏览器兼容问题以及解决办法。惋惜对这种用法不熟,没看懂。
blog