JavaScript не способен поддерживать продолжения: в нем отсутствуют хвостовые вызовы.
Обычно я бы написал это, чтобы использовать «очередь», хотя CPS также выполнима (просто иметь конечный стек:-) Обратите внимание, что другое состояние также может быть зафиксировано в замыкании, что делает его «явным продолжением» своего рода ... в очень грубом смысле.
Пример использования замыкания и очереди:
function prodFactory (array){
// dupe array first if needed, is mutated below.
// function parameters are always locally scoped.
array.unshift(undefined) // so array.shift can be at start
// also, perhaps more closured state
var otherState
// just return the real function, yippee!
return function prod () {
array.shift()
// do stuff ... e.g. loop array.shift() and multiply
// set otherState ... eat an apple or a cookie
return stuff
}
}
var prod = prodFactory([1,2,3,0,4,5,0,6,7,8,0,9])
// array at "do stuff", at least until "do stuff" does more stuff
prod() // [1,2,3,0,4,5,0,6,7,8,0,9]
prod() // [2,3,0,4,5,0,6,7,8,0,9]
prod() // [3,0,4,5,0,6,7,8,0,9]
Удачное кодирование.
"Законченная реализация".Хотя эта конкретная проблема может избежать мутации массива и просто использовать индекс: применяются те же понятия.(Ну, немного по-другому. Только с индексом закрытая переменная будет изменена, тогда как при таком подходе объект мутируется.)
function prodFactory (array) {
array = array.slice(0)
return function prod () {
var p = 1
for (var n = array.shift(); n; n = array.shift()) {
p *= n
}
return p
}
}
var prod = prodFactory([1,2,3,0,4,5,0,6,7,8,0,9])
prod() // 6
prod() // 20
prod() // 336