Если я определяю функцию
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)))))));