JavaScriptCore вложенный "вызов" проблема производительности


если я определяю функцию

inc = function(x) { return x + 1 }

и сделать вложенный вызов его

inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))

это приведет к значению 22. Если я пересмотрю вложенное выражение, чтобы вместо этого использовать call, проходящей в null на this, а

inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))))))))))))))))))

это также приведет к значению 22.

но, на JavaScriptCore эта вторая форма, кажется, потребляет O(2^n) памяти, где n is количество вложенных вызовов. Это не так, если я попробую этот JavaScript в Firefox или Chrome, поэтому он, похоже, изолирован от JavaScriptCore.

у меня очень мало опыта JavaScript (почти нет). У меня нет ощущения компромиссов, которые могут сделать различные реализации JavaScript, а также разумно ли, чтобы пример кода был дорогим в некоторых реализациях (обеспечивая общую поддержку замыканий или некоторых таких), в то время как эффективный в других.

мой вопрос: Является ли этот код по своей сути проблематичным? Следует ли его переписать, чтобы структурировать по-другому? Или код в порядке-у JavaScriptCore просто есть ошибка?

я провел некоторые эксперименты, где рефакторинг нескольких внутренних вызовов к временным будет "усекать" поведение удвоения памяти

var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))));

var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp1)))))));

inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp2)))))));
1 52

1 ответ:

основываясь на комментариях по этому вопросу, консенсус заключается в том, что нет фундаментальной проблемы с написанным кодом, но вместо этого это ошибка в JavaScriptCore.

на авиабилет подано, Он был подтвержден как воспроизводимый и был импортирован в радарную систему Apple.