日期:2014-05-16  浏览次数:20380 次

一个函数重名问题,同一页文件中和独立js文件中的区别
  
  //代码段1开始
  function a(){
  alert(1);
  }
  var f1=a;//保存a
  //代码段1结束

  //代码段2开始
  function a(){
  alert(2);
  }
  var f2=a;//保存a
  //代码段2结束

  window.onload=function(){
  f1();//f1被后一个a覆盖了, 显示结果为2, 但我将代码段1和代码段2分别放在两个独立的js文件中, 引入后调用f1()却显示结果为1, 这是怎么回事, 有啥区别
  }

------解决方案--------------------
js 预编译
http://blog.csdn.net/hch126163/article/details/6022557
------解决方案--------------------
估计楼上的都没动手试一下,结果确是如楼主所说:没有被覆盖。

这个问题来源于js的执行原理:
在页面中,(除去在html元素中直接添加的)js代码的放置无非就两种情形:

//情形a
<script type="text/javascript" src="xxx.js"></script>
//情形b
<script type="text/javascript">
    code......
</script>

(1)a中的js文件或b中的js代码块都是js代码段,引入一个js文件就是一个代码段,同样一个script闭合标签夹着一堆js代码也是一个代码段。一般页面中常常会有多个代码段,既有js文件,也有块式的,当页面载入时:这些代码段是按照自上而下的顺序执行的。也就是说,执行完了一个代码段才会执行下面第二个代码段。
(2)每个代码段的执行顺序是相同的:
检查语法-->预解析-->最后执行


楼主的问题就在于:
当你把js代码全都放在一个代码段中的时候,f1被覆盖不难理解。
当把js代码分成两个文件,也就是分成两个代码段:
第一个代码段:

  function a(){alert(1);}
  var f1=a;

第一个代码段:

  function a(){alert(2);}
  var f2=a;

此时,第一个代码段因为在给f1赋值a的时候只在当前的全局环境中中找到了“function a(){alert(1);}”,所以f1就是函数“function a(){alert(1);}”。
第二段代码,因为又声明了一个同名函数a所以全局中之前的函数a被覆盖,所以f2在赋值的时候是新的a函数“function a(){alert(2);}”。
因为变量f1已经在代码段1中完成赋值,段2中并无任何对f1的操作,所以除非在第二段代码中加入:“var f1=...”,否则f1的值是不变的。

而如果所有的代码放在一起(同一个代码段)的话,因为在预解析的阶段“function a(){alert(2);}”会把“function a(){alert(1);}”覆盖,所以在给f1赋值a的时候,当前的全局环境中a已经是“function a(){alert(2);}”。
------解决方案--------------------
#7 正解!
<script>
function a(){
  alert(1);
  }
  var f1=a;//保存a
  //代码段1结束


  //代码段2开始
  function a(){
  alert(2);
  }
  var f2=a;//保存a
  //代码段2结束
 
  window.onload=function(){
  f1();
  }
</script>
输出 2
<script>
function a(){
  alert(1);
  }
  var f1=a;//保存a
  //代码段1结束
</script>
<script>