Произошла ошибка.
Пожалуйста, обновите страницу.
Fly.js > Документация > Функции > $.memoize()

$.memoize()

Возвращает функцию-обёртку, которая кеширует результаты выполнения исходной функции.

#Функции

$.memoize(function, [hasher], [context])

                    FlyDomNode: {
                        __constructor: function(context) {
                            var array = fnNodeList.makeDomNodeArray(context);
                            for (var a = 0, al = array.length; a < al; a++) {
                                this[a] = array[a];
                            }
                            this.length = al;
                        },

                        size: function() {
                            return this.length;
                        },

                        get: function(index) {
                            return $.isNumber(index) ? this[index] : [].slice.call(this);
                        },

                        addNode: function(flyNode) {
                            return fnNodeList.changeNodeContext(this, flyNode, function(child, context) {
                                context.indexOf(child) === -1 && context.push(child);
                            });
                        },

                        removeNode: function(flyNode) {
                            return fnNodeList.changeNodeContext(this, flyNode, function(child, context) {
                                var position = context.indexOf(child);
                                if (position !== -1) context.splice(position, 1);
                            });
                        },

                        eq: function(index) {
                            if (index < 0) index = index + this.length;
                            return new this.__self(this[index]);
                        },

                        lt: function(index) {
                            return new this.__self(this.slice(0, index));
                        },

                        gt: function(index) {
                            return new this.__self(this.slice(index));
                        },

                        last: function(selector) {
                            var element = this[this.length - 1];
                            return new this.__self(fnStyle.isMatch(element, selector) ? element : []);
                        },

                        first: function(selector) {
                            var element = this[0];
                            return new this.__self(fnStyle.isMatch(element, selector) ? element : []);
                        },

                        normalize: function() {
                            return fnNodeList.transformNodeContext(this, function(item, context) {
                                if ($.isNode(item)) context.push(item);
                            });
                        },

                        each: function(callback, context) {
                            $.each(this, callback, context);
                            return this;
                        },

                        name: function() {
                            return this[0].tagName.toLowerCase() || null;
                        }
                    }
                

$.memoize(function, [hasher], [context])
Возвращает: Function ()

Возвращает функцию-обёртку, которая кеширует результаты выполнения исходной функции.

function: Function ()

Исходная функция.

hasher: Function ()

Функция, возвращающая ключ для кеширования.

context: Any *

Контекст выполнения исходной функции function.

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

По умолчанию hasher возвращает строковое представление первого переданного аргумента. Это удобно для простых функций, однако, в большинстве случаев приходится переопределять такое поведение.

Стоит отметить, что контекст context выставляется только для исходной функции function, но не для hasher.

Чтобы лучше понять принцип работы $.memoize(), изучите примеры.

Пример: Кеширование факториала.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8"/>
        <title>Fly.js - $.memoize()</title>

        <script src="/scripts/fly.js"></script>
    </head>
    <body>
        <p id="times"></p>
        <p id="p1"></p>
        <p id="p2"></p>
        <p id="p3"></p>

        <script>
            var fn = function(n) {
                    $('#times').append('+');
                    return $.factorial(n);
                },
                wrapper = $.memoize(fn);

            $('#p1').html(wrapper(5));
            $('#p2').html(wrapper(5));
            $('#p3').html(wrapper(10));
        </script>
    </body>
</html>

Пример: Кеширование результатов функции поиска длины гипотенузы по двум катетам.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8"/>
        <title>Fly.js - $.memoize()</title>

        <script src="/scripts/fly.js"></script>
    </head>
    <body>
        <p id="times"></p>
        <p id="result"></p>

        <script>
            var fn = function(one, two) {
                    $('#times').append('+');
                    return Math.sqrt(one * one + two * two);
                },
                wrapper = $.memoize(fn, function(one, two) {
                    return one + '&' + two;
                }),
                result = $('#result');

                result.html(wrapper(8, 15));
                result.html(wrapper(8, 15));
                result.html(wrapper(8, 15));
        </script>
    </body>
</html>