你放在不同的文件中还得看你引入JS文件的先后顺序,如果你先引用2段代码再引用1段代码就会显示alert(1),反之显示lert(2),可能是这个原因给你照成了没被覆盖的假象而已。

解决方案 »

  1.   

    引入js  你就可以把它们当做都原封不动的写到了你的html页面里了
      

  2.   

    一样。
    在chrome和IE  function在所有执行代码前先编译
      

  3.   

    js 预编译
    http://blog.csdn.net/hch126163/article/details/6022557
      

  4.   

    估计楼上的都没动手试一下,结果确是如楼主所说:没有被覆盖。这个问题来源于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);}”。
      

  5.   

    还真没是过。
    原来这样是不一样的
    <script>
    function a(){
      alert(1);
      }
      var $f1=a;
    </script>
    <script>
    function a(){
      alert(2);
      }
      var $f2=a;
    </script><script >
    $f1();</script>
      

  6.   

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

  7.   

    函数是被被覆盖了,因为 a() 时输出的是 2
    但作为第一段的函数 a 的载体 f1 并没有人去覆盖它
    所以从这个意义上说, #7 的解释又是错误的
      

  8.   

    其实 alert(f1) 就真相大白了