2011-11-22 80 views
2

Opera的JavaScript函數長度有一些限制嗎?Opera的Javascript函數大小限制?

我測試過,如何有效地提供字典作爲javascript函數,測試我們給出的關鍵字並返回適當的值。

該解決方案的優點是,字典將被緩存而不使用LocalStorage從HTML5,僅使用瀏覽器緩存機制。

我已經做了測試與地址數據庫,書寫功能,該片段是在這裏:

window.dict = {}; 

dict.getStreets = function (sym) { 
if (sym == '46') { 
    return [["Andrzeja","10028"],["B\u0142o\u0144ska","34182"],["Cisowa","10027"],["Dojazdowa","177799"],["Dolna","126726"],["Dzia\u0142kowa","153180"],["Dzikiej R\u00f3\u017cy","211051"],["Fio\u0142kowa","98636"],["Gimnazjalna","126727"],["Gwia\u017adzista","126728"],["Jana","34189"],["Jod\u0142owa","34183"],["Majowa","34184"],["Mi\u0142a","98637"],["Orzechowa","34185"],["Osiedlowa","153181"],["Polowa","34186"],["Po\u0142udniowa","98638"],["Prosta","211052"],["Purzyckiego","126729"],["R\u00f3\u017cana","211053"],["S\u0142owicza","224648"],["Spokojna","34187"],["Stra\u017cacka","98639"],["Szarotki","34188"],["\u015awierkowa","224596"],["Weso\u0142a","153182"],["Wschodnia","126730"],["Zachodnia","34190"]]; 
} else if (sym == '98') { 
    return [["Bia\u0142ych Brz\u00f3z","177802"],["Calineczki","34192"],["Chabrowa","98640"],["Czarodziejska","98641"],["D\u0142uga","10029"],["Dworcowa","34191"],["Familijna","68666"],["Kasztanowa","153183"],["Konwaliowa","217850"],["Ko\u015bcielna","10030"],["Kr\u0119ta","34193"],["Le\u015bna","177803"],["Lipowa","153184"],["\u0141\u00f3dzka","217851"],["Malownicza","177804"],["Masztowa","217852"],["Milenijna","10031"],["P\u00f3\u0142nocna","10032"],["Przesmyk","10033"],["Romantyczna","34720"],["Skrajna","98642"],["Sosnowa","98643"],["Stokrotki","126731"],["T\u0119czowa","10034"],["Uko\u015bna","68667"],["Urocza","34721"],["Ustronna","98644"],["Zaciszna","34722"],["Zau\u0142ek","217853"]]; 
} else if (sym == '224') { 
    return [["Maj\u0105tkowa","217854"],["Orionist\u00f3w","153185"],["Wiosenna","98645"]]; 
} else if (sym == '394') { 
    return [["Kwiatowa","177805"],["Sochaczewska","217855"]]; 
} else if (sym == '460') { 
    return [["Grodziska","34723"],["\u0141\u0105ki","98647"],["Nowakowskiego","217856"],["\u017buk\u00f3wka","95137"]]; 
// ...... about 5MB of data goes here 
} else return null; 
}; 

整個javascipt的擁有5MB的長度。這適用於FireFox(非常緩慢,正如我所假設的),IE 9和Chrome(相當快),但在Opera下它不起作用。當我限制功能的大小,它的工作原理,但與全尺寸甚至沒有功能getStreets設置字典對象。

因此,我確信Opera不允許創建如'大'瀏覽器那樣的大功能。我的問題是,如果它在某個地方記錄了什麼限制,或者它只是一些緩衝區溢出(或類似的)在Opera的JavaScript引擎?

更新 詞典的情況只是一個靈感,使這個代碼生成。問題是關於Opera javascript分析器的限制,而不是上面的代碼的其他寫法

回答

3

這是一個已知的限制,這將是很快的歷史:它與功能的大小沒有關係,但鏈接數如果有限制。 .else if ..陳述你可以有。在這個測試和我的電腦上,限制是1020個鏈式語句:http://jsfiddle.net/8RAn8/但我不確定這是否真的是靜態硬編碼限制或取決於某些參數。如果你從..else中刪除else如果..鏈接它運行得很好:http://jsfiddle.net/8RAn8/1/並且我已經測試了超過15000如果成功沒有其他的。

我們即將修復此錯誤並將限制更改爲更接近其他瀏覽器的限制。

+0

因此,對於原始海報的具體解決方案:如果您只是從代碼中刪除「其他」,它應該可以正常工作,而且無論如何它都不會對性能產生任何影響:)。請注意,使用switch語句可能會提供更好的性能,但是您應該測試並進行基準測試,而不是採取相應措施。 – hallvors

+0

是的,它在刪除「else」之後正在運行 –

0

是的,有一些限制。不,我不知道它們究竟是什麼。對不起,這是一個相當無用的答案..

+0

順便說一句,將5MB函數腳本作爲測試用例是很有趣的。也許你可以通過電子郵件發送給我? :) – hallvors

+0

http://jsfiddle.net/是這種測試用例的完美場所。 我也希望看到/研究Opera的侷限性。以下是Opera強加的其他一些人爲限制: http://operawiki.info/ArtificialLimits 注意:這不是很好維護。 – fearphage