Что за бред? three() просто вызывает функцию one(), причём тут какое-то замыкание?
three() - это ссылка на two(), а не на one() и соответственно вызывает код two(), которая ссылается на переменную функции one();
Вот тебе пример (но на Делфи). Отличий по сути нет. Вызов функции, которая помещена в getOne изменяет значение параметра, который был передан в canGetCount()
function canGetCount(N: Integer): TFunc<string>;
begin
Result :=
function: string
begin
Dec(N);
Exit(IfThen(N >= 0, 'yes', 'no'));
end;
end;
begin
var getOne := canGetCount(2);
writeln(getOne()); //yes
writeln(getOne()); //yes
writeln(getOne()); //no
readln;
end.