Реализовать кеш используя закрытие - PullRequest
0 голосов
/ 31 октября 2018

Я хочу реализовать кеш-подобное закрытие, которое кеширует результаты для более быстрой работы. Например, представьте, что даны два числа, и цель состоит в том, чтобы возвратить их кратное число. Сначала мы смотрим на кэш, рассчитывается ли оно раньше или нет, если да, то оно возвращает значение быстро, в противном случае его следует вычислить и сохранить в кеше.

Вот что я реализовал:

var Obj = {
    h(x, y) {
        return x + y;
    },
    slow(x, y) {
        alert('called slow function with ' + x + ', ' + y);
        return x * y * this.h(x, y)
    }
}

function c (func){
    var cache = {};
    return function(x, y){
        if (!cache[[x, y]]){
            cache[[x, y]] = func(x, y);
        }
        return cache[[x, y]];
    }
}

Obj.slow = c(Obj.slow);
alert(Obj.slow(1, 4));
alert(Obj.slow(1, 2));
alert(Obj.slow(1, 4));
alert(Obj.slow(1, 3));
alert(Obj.slow(1, 2));
alert(Obj.slow(1, 3));

Я не знаю, почему это не работает. Буду благодарен, если кто-нибудь сможет мне помочь. Ошибка в строке 7 с ключевым словом this.

TypeError: this.h не является функцией

1 Ответ

0 голосов
/ 31 октября 2018

this в медленном методе, когда вызов выполняется в контексте окна, поэтому метод h недоступен. bind контекст для Obj заставит его работать.

Обновленный код

var Obj = {
    h(x, y) {
        return x + y;
    },
    slow(x, y) {
        alert('called slow function with ' + x + ', ' + y);
        return x * y * this.h(x, y)
    }
}

function c (func){
    var cache = {};
    return function(x, y){
        if (!cache[[x, y]]){
            cache[[x, y]] = func(x, y);
        }
        return cache[[x, y]];
    }
}
Obj.slow = Obj.slow.bind(Obj); // You have to bind the object slow method to object context

Obj.slow = c(Obj.slow);
alert(Obj.slow(1, 4));
alert(Obj.slow(1, 2));
alert(Obj.slow(1, 4));
alert(Obj.slow(1, 3));
alert(Obj.slow(1, 2));
alert(Obj.slow(1, 3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...