<script>
  function fnTest()
  {
  alert('aaa');
  }
  var fnObjRef = fnTest;
  fnTest = null;
  fnObjRef();
  </script>
为什么函数 fnTest 赋值为 null 后, fnObjRef 还可以调用呢?JavaScript函数

解决方案 »

  1.   

    <script>
      function fnTest()
      {
      alert('aaa');
      }
      document.write(fnTest);//通过这句,证明fnTest是function,而不是变量
      var fnObjRef = fnTest;
      //fnTest = null;//有没有都一样,可以注释掉
      fnObjRef();//由于var fnObjRef = fnTest的赋值,使得fnObjRef产生与fnTest相同结构的函数</script>
      

  2.   

    <script>  function fnTest()
      {
      alert('aaa');
      }
      document.write(fnTest);//通过这句,证明fnTest是function(一个函数,也可叫做一个方法),而不是变量
      var fnObjRef = fnTest;//这句把fnTest函数的赋值给fnObjRef
      document.write("<br />");
      document.write(fnObjRef);//输出function fnTest() { alert('aaa'); },证明fnObjRef成为了function
      fnTest = null;
      document.write("<br />");
      document.write(fnTest);//此时会输入null,说明这个时候fnTest被null赋值,不过这倒是不影响后面
      fnObjRef();//由于var fnObjRef = fnTest的赋值,使得fnObjRef产生与fnTest相同结构的函数
      //最后这句,是调用fnObjRef方法,也就是执行最上面的 function fnTest(){alert('aaa');}
      //所以会弹出aaa
      //以上在IE和火狐测试过
    </script>大侠你天资聪颖,想必一定能明白,不明白再问我就可以了
      

  3.   

    引用类型。
     function fnTest()
      {
          alert('aaa');
      }函数保存到一个内存区域: ox25845
    fnTest 保存函数的内存地址 ox25845。
     var fnObjRef = fnTest; 传地址,fnObjRef 和fnTest 的值都是:ox25845 fnTest = null; // fnTest指向空。但是 fnObjRef 还是用了ox25845。内存区域: ox25845始终还存在。
    具体 内存区域: ox25845 什么时候会被浏览器回收。不同浏览器机制不一样。去网上搜索吧
      

  4.   

    函数时引用类型
    你可以把引用类型看做路标,通过该路标可以找到目的地
    var fnObjRef = fnTest;//表示两个路标指向同一个目的地
    fnTest = null;//你把其中一个路标fnTest摘掉了,它没了,但另一个路标fnObjRef仍然存在,fnObjRef仍然指向目的地
      

  5.   

    <script>function fnTest()
    {
    alert('aaa');
    }
      
    var fnObjRef = fnTest;//此时的fnObjRef已经成型
    fnTest = null; //只是影响fnTest,但是不影响fnObjRef
    document.write(fnObjRef+"<br />");
    fnObjRef = fnTest;//如果此时再加这句,就会影响
    document.write(fnObjRef);
    fnObjRef();//此时已经无作用了</script>fnTest也就是函数内存地址的指针如果想让他们都没作用,需要都指向空值