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