像我這樣最初並不是系統學習JavaScript的人,看到with這個東西的第一個感覺是興奮——不用再重複地寫“element.style.xxx = …”了,只需要
view plaincopy to clipboardprint?
with (element.style) {
xxx = ...;
yyy = ...;
……
}
with (element.style) {
xxx = ...;
yyy = ...;
……
}但是作為解釋型語言,JavaScript都需要在執行時來決定xxx/yyy到底是什麼東西。對每一個名字(不只是被賦值的,也包含讀取的變數!)它會先去在with括號裡的物件的屬性裡去尋找,然後才會找局部變量,最後是全域變數。在JavaScript的虛擬機器、JIT技術普及之前,這種效能問題需要非常的注意。
正確的做法是為element.style做一個local variable的cache:
view plaincopy to clipboardprint?
var es = element.style;
es.xxx = ...;
es.yyy = ...;
...
var es = element.style;
es.xxx = ...;
es.yyy = ...;
……這不僅相對減少了程式碼大小,同時效能上也比element.style.xxx = … 好得多。