问题形成的主要原因
该问题在单一页面里面是不会出现的,而在使用多框架开发的项目中,可能会出现。
问题的关键我下面从一个实例中分析:
我们有一个框架页面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
分享到:
相关推荐
标题 "C++中调用JavaScript的开发库" 暗示了我们正在讨论一个允许C++程序执行JavaScript代码的库。这种技术通常用于在桌面应用中集成动态逻辑,或者为现有C++项目添加脚本支持。JavaScript作为一种轻量级且功能强大...
这本书的重点在于优化JavaScript代码的性能,确保应用程序的高效运行。书中可能包含以下知识点: 1. **性能分析**:如何使用开发者工具进行性能测试,识别瓶颈并进行优化。 2. **数据结构和算法**:选择合适的数据...
总的来说,理解JavaScript的时间和空间效率,通过优化循环、函数调用、内存管理和利用工具,可以有效地提升代码的性能,为用户提供更流畅的体验。在实际开发中,平衡时间和空间效率,根据应用场景选择合适的优化策略...
`cpp-mJS` 提供了一定程度的安全控制,但作为开发者,你需要确保在执行JavaScript代码时不会暴露敏感信息或导致系统不稳定。 4. **性能优化**:`cpp-mJS`的设计考虑了效率,但具体性能取决于你的使用方式。为了最大...
在给定的文档中,我们讨论的是如何在Vue项目中使用`monaco-editor-vue`库,这是一个基于Monaco Editor的Vue组件,Monaco Editor是一个强大的代码编辑器,由Microsoft开发,主要用于提供类似于VS Code的代码编辑体验...
JavaScript错误处理是编程过程中不可避免的部分,它涉及到识别、捕获和响应代码运行时可能出现的问题。本文将详细探讨JavaScript中的错误分类、处理机制以及如何有效地管理错误。 首先,我们来了解JavaScript中的...
9. **源码调试**:V8提供了强大的源码级调试工具,如Chrome DevTools,可以帮助开发者定位和修复JavaScript代码中的问题。 10. **性能分析**:V8内置了性能分析工具,如`%OptimizeFunctionOnNextCall`和`%...
10. **性能优化**:优化JavaScript代码以减少内存占用和提高页面加载速度至关重要。例如,避免全局变量,及时释放不再使用的资源,以及使用事件委托来减少事件监听器的数量。 以上是针对“S2的JavaScript实战项目_...
Vue.js 是一个流行的前端JavaScript框架,用于构建用户界面。在这个示例中,我们将讨论如何在Vue项目中实现一个图片拖拉、旋转和放大缩小的组件。这个组件的主要目的是提供一个交互式的图片查看体验,允许用户通过...
`new`操作符用于创建新对象实例,而`eval()`函数则能执行一个字符串作为JavaScript代码,虽然由于安全和性能问题,通常不推荐使用。 字符串对象提供了处理文本的方法,例如`substring`、`indexOf`等。`Math`对象...
性能分析器,如Chrome DevTools中的Timeline或Firefox的Performance Panel,能够记录和分析JavaScript代码的执行时间,包括DOM操作、渲染、网络请求和事件处理等。通过这些工具,开发者可以定位到代码中的性能瓶颈,...
### JavaScript按键事件(兼容各浏览器) #### 知识点概览 本文主要介绍了JavaScript中处理按键事件的方法,并探讨了如何让这些事件处理程序兼容不同类型的浏览器。按键事件主要包括`keydown`、`keypress`和`keyup`...
它并不像编译型语言那样有硬件级别的暂存器,但在理解和优化JavaScript代码时,我们确实会用到类似的逻辑。例如,当我们讨论变量声明、作用域、函数调用等时,可以类比于暂存器来帮助理解数据的存储和访问过程。 1....
"8种fakeloader页面加载效果JS代码.zip"这个压缩包文件显然包含了八种不同的JavaScript实现,用于创建各种页面加载动画效果。下面我们将详细讨论这些知识点。 1. **JavaScript基础**:首先,要理解这些代码,你需要...
这里提到的问题是,如果你在`ExecJavascript`中直接使用了`SysFreeString(pCComBSTR)`,当函数内部已经释放了`pCComBSTR`时,你再次调用`SysFreeString`会导致内存泄漏。因此,正确的做法是只在你创建BSTR对象的地方...
【使用IBM静态工具优化Java代码】的文档主要讨论如何利用IBM的静态分析工具来提升Java代码的质量,通过理解和处理分析报告中的错误级别,包括ERROR、MISTAKE和WARNING,以减少潜在的问题并防止运行时异常。...
本文将基于给定的示例代码,详细讲解如何利用JavaScript对表单输入进行限制,从而帮助开发者更好地理解和应用这些技术。 #### 二、基础知识回顾 在深入讨论之前,我们先回顾一些基础概念: 1. **HTML**:超文本...
README.TXT文件是项目的重要指南,它提供了关于JSEngine 3.5的基本介绍、安装步骤、使用示例和可能遇到的问题解答。通过阅读这个文件,开发者可以快速上手并避免常见的错误,比如正确配置项目设置以引入JSEngine 3.5...
在标题"sourceformatX"中,我们可以推测这可能是一款针对源代码格式化的工具,能够帮助程序员优化他们的C、C++以及JavaScript代码。下面将详细讨论源代码优化的关键方面以及这些语言的优化策略。 1. **C和C++代码...
V8Android是一个开源项目,它的目标是在Android应用程序中嵌入Google的V8 JavaScript引擎,以实现JavaScript代码在移动设备上的本地执行。这个项目为开发者提供了一个实用的示例,展示了如何将V8引擎集成到Android...