Opera 上的 Javascript 函数大小有限制吗?

发布于 2024-12-17 08:43:31 字数 2520 浏览 3 评论 0原文

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 对象上设置函数 getStreet

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

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

Is there some limitation of javascript function length on Opera?

I've tested, how efficient solution will be to provide dictionaries as javascript function that tests what key we give and return proper values.

The advantage of that solution would be, that dictionaries would be cached without LocalStorage from HTML5, using browser cache mechanism only.

I've done test with address database, writing function, which fragment is here:

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;
};

The whole JavaScipt has over 5MB length. This works under FireFox (very slow, as I've supposed), IE 9 and Chrome (quite fast), but under Opera it is not working. When I've limited function's size, it works, but with full size there's not even function getStreets set on dict object.

So I see for sure that Opera does not allow to create such big functions, as only from 'big' browsers. My question is, if it is somewhere documented what the limits are, or it is just some buffer overflow (or anything similar) in Opera's javascript engine?

update
The case with dictionaries was only an inspiration that made this code to be generated. The question is about limits to the Opera javascript parser, not the other way the code above could be written

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青衫负雪 2024-12-24 08:43:31

这是一个已知的限制,很快就会成为历史:它与函数的大小无关,但是您可以拥有的链接 if..else if.. 语句的数量是有限的。在此测试中,在我的计算机上,限制为 1020 个链接语句: http://jsfiddle.net/8RAn8/但我不确定这是否真的是静态硬编码限制或取决于某些参数。如果您从 ..else if.. 链接中删除 else ,它就可以正常运行: http://jsfiddle.net/8RAn8/1/ 并且我已经测试了超过 15000 个 if 块在没有 else 的情况下成功阻止。

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

This is a known limitation which will soon be history: it's got nothing to do with the size of the function, but there is a limit to the number of chained if..else if.. statements you can have. In this test and on my computer the limit is 1020 chained statements: http://jsfiddle.net/8RAn8/ but I'm not sure if this is really a static hard-coded limit or depending on some parameters. If you remove the else from the ..else if.. chaining it runs just fine: http://jsfiddle.net/8RAn8/1/ and I've tested more than 15000 if blocks successfully without else.

We're about to fix this bug and change the limit to something closer to what other browsers have.

三人与歌 2024-12-24 08:43:31

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

Yes, there are some limitations. No, I don't know what they are exactly. Sorry that this is a fairly useless answer..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文