dimanjy
@dimanjy
Недопрограммист и полуинженер.

Как проиндексировать сами функции?

Есть метод, в который передается некая функция.

Мне нужно отследить, сколько раз в этот метод была передана одна и та же функция. Функции в метод поступают в большом количестве и часто разные, но среди этого потока бывают вызовы одной и той же функции.

MyClass.prototype.method = function(fn){
    fn.apply(this, []);
};


Можно складывать все функции в обычный массив, а при каждом вызове пробегать его целиком, сравнивая функции, но это ужос и тормоза:

var functions_array = [];
MyClass.prototype.method = function(fn){
    var found = false;
    for(var i=0; i<functions_array.length; i++){
        if( functions_array[i] === fn ){
            // Функцию уже вызывали
            found=True; break;
        }
    }
    if( !found ) functions_array.push(fn);
    fn.apply(this, []);
};


А можно, наверное, как-то проиндексировать функцию и сформировать ключ?

var functions_storage = {};
MyClass.prototype.method = function(fn){
    var found = false;
    var key = index_function(fn);
    if( functions_storage[key] !== undefined ){
            // Функцию уже вызывали
            found=True;
    }
    if( !found ) functions_storage[key] = fn;
    fn.apply(this, []);
};


Вот как мне сформировать `key` для функции, чтобы он точно идентифицировал эту функцию и отлавливал именно её повторные вызовы?
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
mlnkv
@mlnkv
JavaScript Developer
function MyClass() {
  this.fnMap = new WeakMap();
}

MyClass.prototype.method = function(fn) {
  if (this.fnMap[fn]) {
    return;
  }
  this.fnMap[fn] = true;
  fn.apply(this, []);
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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