Internet Explorer 8(我需要支持,不幸的是,不可協商)顯示the following warning once 5,000,000 "executed script statements" have occurred in one synchronous script execution(例如,來自超時或來自事件處理程序)。對於IE的「停止運行此腳本?」,什麼是「執行腳本語句」?警告櫃檯?
停止運行此腳本?此頁上的腳本導致您的網絡瀏覽器運行緩慢。如果它繼續運行,您的計算機可能會變得無響應。
我想優化一些複雜的重型代碼,以避免此錯誤消息。我已經遵循標準的建議,這是儘可能的使用諸如setTimeout()
之類的東西將代碼拆分成單獨的異步塊。如果不創建競爭條件,我不能再做這些事情,所以我期望簡化所有發生多次的代碼,例如在大的for
循環內。
要做到這一點,我想知道究竟是什麼IE算作一個「執行的腳本語句」,所以我會知道我在循環中的優化將發揮最大作用而哪些不會。
我查找了「執行的腳本語句」的標準定義,但沒有成功 - 大多數時候使用了「腳本語句」,它似乎是指html <script>
標記的內容,這顯然是不同的術語。定義Statement (computer science)很有幫助,但它們如何計算的含義不明確(請參閱下面的示例)。
Here's what Microsoft have to say on the matter(爲便於閱讀,我已經添加了一段時間):
如Internet Explorer 4.0及更高版本,超時不再是基於Windows消息的固定值。 Internet Explorer現在會跟蹤執行的腳本語句的總數,並在每次使用腳本引擎爲當前頁面啓動新腳本執行(例如從超時或事件處理程序)時重置該值。
當該值超過閾值時,Internet Explorer將顯示一個「長時間運行的腳本」對話框。
Internet Explorer不檢查每條指令是否超出限制。腳本引擎定期對所執行的語句數進行輪詢,然後Internet Explorer檢查是否超出限制。由於這種機制,如果在腳本引擎輪詢Internet Explorer之前完成整個腳本的執行,則可以在沒有對話框的情況下執行超過默認限制。
舉,似乎模棱兩可給我一些簡單的例子:
- 將
var a = 1, b = 2, c = 3;
算一個「執行的腳本語句」和var a = 1; var b = 2; var c = 3;
數三?或者都是三個? - 將
if(someFunction()){}
(不包括內someFunction()
語句是一個語句,或兩個(一個電話加一個條件)? - 是
if(a){}else{}
一個條件語句或兩個?如果有,會if(a){}else if(b){}
是兩個? - 是
if(a==b||(c&&a==c&&c==d)){}
一個,兩個,三個,四個,五個陳述(或更多?)?我知道,像if(a){}
這樣的任何東西都會調用一個Javascript函數來轉換爲布爾值 - 這是否會在比較本身上添加其他語句? - 將
var value = someFunction(); if(value){}
三個,因爲它增加了一個賦值,或者將函數調用作爲賦值語句的一部分嗎? - 鏈接怎麼樣?例如,如果使用jQuery,那麼(不包括執行的腳本語句內的每個函數)是行
$(selector).show().css(obj).appendTo($el);
一個「已執行的腳本語句」,還是四個?我想可能會是四個「呼叫」聲明。 - 據推測,var
$someEl = $(selector).show().css(obj).appendTo($el);
會將此增加到五個語句 - 四個呼叫加分配? (IE將不只是指望它作爲一個賦值語句被感動嗎?)
當然以上這些簡單的例子是小混混 - 我試圖「瞭解敵人」這裏可以判斷如何最好優化複雜的循環。
我正在尋找無論是經驗法則或一些解釋例子像上面
我不能說明確的,但'var whatever'幾乎肯定不會計數,因爲該語句不在運行時運行。除此之外,它的_probably_一行代碼執行,如果if(foo){'或您的長jQuery鏈在最後。然而,jQuery鏈可能會在jQuery庫中運行幾百行代碼。換句話說,#1是0,#5是2(用分號隔開),其他所有的都是1.但是你必須遵循代碼路徑來查看在#2,#5中實際運行了多少代碼, #6,#7 –