В вызове aaaa(1) this устанавливается в window (в строгом режиме это undefined, были бы жертвы :)).
Т. е. в теле добавляются 3 переменных для window (число и две функции) и возвращается window.
Далее вызывается метод window bbbb(), который зачем-то сохраняет this в self (сохранение контекста нужно при его потери, в теле window.bbbb контекст не теряется);
выводит window.n (которое 1 после установки в aaaa(1));
дальше происходит перезапись методов их копиями, но с новым значением window.n, которое теперь 5, inscr(), очевидно, инкрементирует window.n (теперь это 6);
выводится новое значение.
Вполне подходящее решение есть в ответе пользователя @Igor, продублирую его:
function aaaa(v) {
var result = {};
result.n = v;
result.inscr = function() {
this.n++;
}
result.bbbb = function(v) {
var self = this;
console.log(this.n);
aaaa(5).inscr();
console.log(self.n);
}
return result;
}
aaaa(1).bbbb();
На каждый новый вызов aaaa создаётся новый объект с индивидуальными параметрами (возможно, функции ссылаются на один объект, точно не знаю).
thisэтоwindow? "должны вывести один и тот же результат" - какой? – Nov 30 '16 at 23:14