Подтвердить что ты не робот

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 - количество вложенных вызовов. Это не тот случай, если я пытаюсь использовать этот 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)))))));
4b9b3361

Ответ 1

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

Для зарегистрированного билета он был подтвержден как воспроизводимый и был импортирован в систему Apple Radar.