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

新手提问,关于函数赋值为null 的问题

  <script>
  function fnTest()
  {
  alert('aaa');
  }
  var fnObjRef = fnTest;
  fnTest = null;
  fnObjRef();
  </script>


为什么函数 fnTest 赋值为 null 后, fnObjRef 还可以调用呢?
JavaScript 函数

------解决方案--------------------
引用类型。
 function fnTest()
  {
      alert('aaa');
  }

函数保存到一个内存区域: ox25845
fnTest 保存函数的内存地址 ox25845。
 var fnObjRef = fnTest; 传地址,fnObjRef 和fnTest 的值都是:ox25845

 fnTest = null; // fnTest指向空。但是 fnObjRef 还是用了ox25845。内存区域: ox25845始终还存在。
具体 内存区域: ox25845 什么时候会被浏览器回收。不同浏览器机制不一样。去网上搜索吧
------解决方案--------------------
函数时引用类型
你可以把引用类型看做路标,通过该路标可以找到目的地
var fnObjRef = fnTest;//表示两个路标指向同一个目的地
fnTest = null;//你把其中一个路标fnTest摘掉了,它没了,但另一个路标fnObjRef仍然存在,fnObjRef仍然指向目的地

------解决方案--------------------
<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也就是函数内存地址的指针

如果想让他们都没作用,需要都指向空值