【问题标题】:Javascript function size limit on Opera?Opera 上的 Javascript 函数大小限制?
【发布时间】:2011-11-22 15:14:23
【问题描述】:

Opera 上的 javascript 函数长度有限制吗?

我已经测试过,提供字典作为 javascript 函数来测试我们提供什么键并返回正确值的解决方案有多有效。

该解决方案的优点是,字典将在没有来自 HTML5 的 LocalStorage 的情况下被缓存,仅使用浏览器缓存机制。

我已经用地址数据库做过测试,写函数,这里是哪个片段:

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 下它不起作用。当我限制了函数的大小时,它可以工作,但是在完整大小的情况下,甚至没有在 dict 对象上设置函数 getStreets

所以我确信 Opera 不允许创建如此大的功能,因为只能从“大”浏览器创建。我的问题是,如果它在某个地方记录了限制是什么,或者它只是 Opera 的 javascript 引擎中的一些缓冲区溢出(或类似的东西)?

更新 字典的案例只是生成此代码的灵感。问题是关于 Opera javascript 解析器的限制,而不是上面代码的其他编写方式

【问题讨论】:

    标签: javascript function limit opera


    【解决方案1】:

    这是一个已知的限制,很快就会成为历史:它与函数的大小无关,但是链式 if..else if.. 语句的数量是有限制的。在这个测试和我的电脑上,限制是 1020 个链接语句:http://jsfiddle.net/8RAn8/ 但我不确定这是否真的是静态硬编码限制或取决于某些参数。如果你从 ..else if.. 链中删除 else ,它运行得很好:http://jsfiddle.net/8RAn8/1/ 并且我已经测试了超过 15000 个 if 块成功而没有 else。

    我们即将修复此错误并将限制更改为更接近其他浏览器的限制。

    【讨论】:

    • 所以对于原始海报的具体解决方案:如果您只是从代码中删除“else”,它应该可以正常工作,并且当您只是无论如何返回:)。请注意,使用 switch 语句可能会提供更好的性能,但您应该对其进行测试和基准测试,而不是相信我的话..
    【解决方案2】:

    是的,有一些限制。不,我不知道它们到底是什么。抱歉,这是一个相当无用的答案..

    【讨论】:

    • 顺便说一句,将 5MB 函数脚本作为测试用例会很有趣。也许你可以用电子邮件发给我? :)
    • jsfiddle.net 是此类测试用例的理想场所。我也有兴趣查看/研究 Opera 的局限性。以下是 Opera 施加的其他几个人为限制:operawiki.info/ArtificialLimits 注意:这没有得到很好的维护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2016-07-23
    • 2011-05-23
    • 2019-03-22
    相关资源
    最近更新 更多