Если немного упростить и структурировать эту лапшу, становится понятно, что ничего странного в порядке выполнения нет:
// Определения функций
function tmp (num) {
var prime = num != 1;
for (var i = 2; i < num; i++) {
if (num % i == 0) {
prime = false;
break;
}
}
console.log('0isPrime');
return prime;
}
tmp.memoized = function(key) {
console.log('memoized');
this._values = this._values || {};
return this._values[key] !== undefined ?
this._values[key] :
this._values[key] = this.apply(null, arguments);
};
tmp.memoize = function() {
console.log('memoize');
var fn = this;
return function() {
return fn.memoized.apply(fn, arguments);
};
};
// Определения переменных
var isPrime, isSeventeenPrime;
// Непосредственно код
console.log('0');
console.log('1');
console.log('2');
isPrime = tmp.memoize(); // console.log('memoize')
console.log('3');
isSeventeenPrime = isPrime(17); // console.log('memoized'), console.log('0isPrime')
console.log(isSeventeenPrime); // console.log(true)
console.log('4');