作者fillano (冒牌费大公)
看板Ajax
标题Re: [问题][js] closure 和 prototype的差别~
时间Wed Jun 3 17:11:39 2009
closure简单说就是function defined in function
用不用closure对於用this指定的property是没差,但是对於区域变数就会有差别:
function test() {
var x=2;
var y=3;
this.getTest = function() {
return x*y;
}
}
var a = new test();
alert(a.getTest());
正常
而下面这样的话:
function test() {
var x=2;
var y=3;
}
test.prototype.getTest = function() {
return x*y;
}
var a = new test();
alert(a.getTest());
就会出现错误。
其实用prototype或是closure没差啦,出问题的是微软...
微软的浏览器跟javascript引擎是独立的东西,导致使用closure的时候,参考到dom
物件无法被正常释放,这是IE6的问题,新版的IE已经不会有问题了,所以可以放心用
closure。
有兴趣的话可以看一下:
http://javascript.crockford.com/memory/leak.html
另外,上面提到的问题是,即使浏览器关掉记忆体也不会被释放,而使用closure的时候
,其实会在特定状况下,让内部的function维持到函数执行结束还有用,这样它所参考
到的本地变数也不会被释放:
function test() {
var x=3;
var y=2;
return function() {
return x*y;
}
}
var a = test();
alert(a());
像上述情况,执行test()完毕後,它会把一个内部函数的参考传给变数a,只要a还有效,
变数x跟y就必须留在记忆体中,否则无法正确执行。这可能会是一个无意间造成的记忆体
未释放问题。更常见的是处理dom:
function addclick(node) {
node.onclick = function() {
alert(node.id);
}
}
addclick(document.getElementById("id"));
透过函数参数传进来的变数,跟本地变数一样意思。
以上是使用closure会有的问题,但是如果不是微软的话,其实不严重,而且这是
javascript本身具备的特性。
--
Sapere Aude! 这就是启蒙运动的口号!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.95.16
1F:推 kevintwo:谢谢这位大大^^a 06/04 00:03
2F:→ kevintwo:请问最後一段的addclick 不是很懂问题所在? 06/04 00:05
3F:推 gpmm:拜谢指教 orz 06/04 00:47
4F:→ fillano:最後一段,node的事件处理函数在closure里面用到node变数 06/04 08:44
5F:→ fillano:,这样会让这个变数参考到的node在addclick函数执行完以後 06/04 08:45
6F:→ fillano:也不会释放。这也是刚刚提到IE6早期出现问题的主因。如果 06/04 08:46
7F:→ fillano:要释放,只要另外把node的事件处理函数改掉就可以,但是IE 06/04 08:46
8F:→ fillano:6即使这样,包括关掉浏览器,记忆体也不会释放。 06/04 08:47
9F:→ fillano:现在的浏览器不会有这类的问题了,而且closure很好用,在 06/04 08:49
10F:→ fillano:你知道他的运作方式下,倒是不妨使用。 06/04 08:49
11F:推 kevintwo:了解了~~~ 谢谢说明~ 06/04 09:29