@mikhailrojo

Почему такой порядок исполнения функций?

подскажите почему такой странный порядок исполнения функций?

console.log('0');
Function.prototype.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);
  };
console.log('1');
  Function.prototype.memoize = function(){
  console.log('memoize');
    var fn = this;
    return function(){
      return fn.memoized.apply( fn, arguments );
    };
};
console.log('2');
  var isPrime = (function(num) {
    var prime = num != 1;
    for (var i = 2; i < num; i++) {
      if (num % i == 0) {
        prime = false;
        break;
      }
    }
    console.log('0isPrime');
    return prime;
  }).memoize();
console.log('3');
  
console.log(isPrime(17));
  
console.log('4');


Консеоль выдает:
0
1
2
memoize
3
memoized
0isPrime
true
4
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Если немного упростить и структурировать эту лапшу, становится понятно, что ничего странного в порядке выполнения нет:
// Определения функций
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');
Ответ написан
Комментировать
Брэйкпоинт поставьте на каждом console log и увидите последовательность вызовов, если так она не очевидна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы