Posts written in 2008‒04

entry 你的内存侧漏了吗

标题党了,其实是内存泄露。(是泄露!!)以下纯是个人见解,读者自辩

首先什么是内存侧漏呢?

我的理解是内存不能被有效的利用,或者内存在被使用后不能有效的回收再利用,最后造成可利用的内存减少,影响执行效率。

之前写JavaScript的时候并不会特意去关注内存泄露的问题,因为那都是些小case,代码也只有几百行。就算造成内存泄露,也被忽略了。(习惯就是这样慢慢养成的,推荐大家不要如此这般)

javascipt内存泄露是如何产生的?

其实很容易产生,当你这么做以后:

function HelloWorld() {
var robot = document.getElementById('robot');
robot.onclick = function () {
window.alert('Hello World!');
};
}

没有去做robot.onclick = null;robot = null;,其实内存就少量的侧漏了...如何保护呢,我们可以换一种形式:

function sayHelloToWorld() {
window.alert('Hello World!');
}
function HelloWorld() {
var robot = document.getElementById('robot');
robot.onclick = sayHelloToWorld;
}

以上就是循环结构(cyclic structure),解释一下:给ID为robot的DOM元素(以下称DOM:robot)添加一个onclick事件函数,DOM:robot就有了相应的事件处理函数,而JavaScript函数对象中也有了DOM:robot的onclick属性,这就形成了循环结构。循环结构所占用的内存是可以被垃圾回收器(garbage collector)回收的,但是由于某个主流浏览器的回收机制有问题,会加重内存泄露。

使用第二种方法,也就是抛弃了闭包(closure)的方式,内存泄露也就跟着去了...

entry href执行javascript好吗

昨天在实际应用中发现href执行javascript会影响iframe的载入,具体表现为在IE下,当点击了带有href="javascript:xxx;"这样的链接时,如果有iframe正在载入,那iframe就会停止载入动作。

其实我并没有让href去执行javascript的意思,我的应用习惯的是这样的href="javascript://;" onclick="xxx();",以前一直没发现这个问题,暂时修改成这样onclick="xxx();return false;"来解决问题,养成这个不良的习惯比较糟糕(更糟糕的其实是写inline javascript的习惯)

 1