事情是這樣的,safari4隆重推出之時,號稱是世界上最快的javascript engine:松鼠魚,我就很開心的給他下載下來玩玩看,結果,原本在safari2, 3都正常的頁面,竟然在safari4掛掉了,OK,這可是個大問題,於是我開始想辦法debug。頭一個就遇到問題,我想辦法要打開safari4的debug mode,但是怎樣試都找不到,雖然後來google 有找到windows版本的方式:Enable Debug Mode in Safari4,終於讓develop menu出現了,但是….裡頭的選項我怎麼點都沒用!!
Fine,也許是windows版本跟MAC版本也有差異吧,那我就直接找台MAC來試,終於成功打開debug mode了。
結果我發現,原來是因為之前為了解決IE6 memory leak的問題,改善了一些createElement的寫法:請參考Finally, the alternative fix for IE6’s memory leak is available,主要觀念是利用try finally來使createElement之後的變數能被回收掉,而不再儲存於記憶體。
[sourcecode=”javascript”]
//this helps to fix the memory leak issue
try {
return obj;
} finally {
obj = null;
}
[/sourcecode]
這樣的寫法在其他瀏覽器都沒問題的,safari4竟然就這樣給他錯了,原因就是出在finally之後,obj被clear了,只要沒有這一句就正常,那…..OK,原本這個fix就是針對IE6而寫的,所以只要判斷IE6在做fix就行了。有趣的是,重複append空物件到DOM節點的次數到達某個次數以上,safari4就crash了(驚!)。
不過這到底算不算bug我也不曉得,也許safari4底層把memory leak的事情解決掉了。這就以後再繼續探究了。
這又再印證了一句話: