论坛首页 Web前端技术论坛

关于“不能调用已经释放的javascript代码”问题的讨论

浏览 3266 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-12  
问题形成的主要原因

    该问题在单一页面里面是不会出现的,而在使用多框架开发的项目中,可能会出现。

问题的关键我下面从一个实例中分析:

    我们有一个框架页面frameset,其中框架里面有2个frame, 一个A,一个B。B是隐藏框架,用来保存数据或作其他操作,A是我们看的见的框架。(也可以是都是看的见的框架)。在多框架的情况下,我们经常会遇到框架B里面的函数访问框架A里面的函数的情况。
而框架A又在很随机的情况下手动或通过提交操作刷新了页面(此时B框架是没有刷新的),如果我们B框架里面有一个变量 var bFunc = top.frame[“A”].aFunc; 而aFunc是框架A的一个函数,正常情况下调用bFunc(); 是没有问题的。但是如果框架A重新刷新过,而框架B 没有刷新的情况下就会出现异常,该异常的描述就是 “不能调用已经释放的javascript代码”。

下面是具体代码

Main.html:
<frameset  rows="0,*" cols="*" id="myframe" name="myframe" framespacing="0" frameborder="no">
<frame src="a.html " name="A" id="A">
<frame src=”b.html" id="B" name="B">
</frameset>


a. html
<script>
function aFunc(){
	alert(“alert”);
}
</script>


b. html
<script>
var bFunc = top.frames[“A”].aFunc;
</script>


    该问题只是在框架B有重新刷新的情况下,再调用bFunc();方法的时候产生。ps:如果变量bFunc 引用的是框架A的一个变量,则不会出现该问题。

    因为javascript的特殊性,对于function类型来说赋值操作都是一个地址引用(其他的变量是拷贝过程)。

    而当框架B重新刷新过后,该框架的javascript重新加载近来,以前的代码空间已经释放掉,所以函数及变量地址都已经发生变化,而框架B的变量bFunc 所指向的框架A的函数aFunc地址不变,导致再次调用bFunc();时出现“不能调用已经释放的javascript代码”。

总结:   
    当我们工程调用框架比较多时候很容易不小心出现这样的隐患, 所以在我们项目中应该尽量少的使用框架,如果实在要用, 则尽量减少框架之间的关系, 避免不必要的麻烦.   


ps: 当我们使用 ajax 的 onreadystatechange 回调函数的时候也容易出现这样类似的错误。


上文仅为个人的一点点认识,希望和大家交流, 谢谢
  • demo.rar (989 Bytes)
  • 描述: 上文的demo
  • 下载次数: 16
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics