Прототипы и вложенные функции возврата, помогите! - PullRequest
2 голосов
/ 27 февраля 2011

Введение:


Я знаю, что "Как работает этот код?"вопросы типа не одобряются, и я буду выглядеть таким же умным, как кирпич, читающий «Солнце» за такой вопрос, но ... вот так.

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

(Да, прежде чем я получу пламя, у меня естьПрочитайте вики сообщества и посты на SO об этой конкретной теме, так что не просто напишите мне об этом, а также прочитайте заметки Джона Рейсга по этому вопросу, которые очень помогли (самый запутанный аспектпонимал this и его методы ссылки на DOM.))

Но вот в чем дело:


Я написал простой парсер API дляSO API, который собирал бы разнообразные данные, я и моя первая попытка войти в JS, я разместил ссылку в чате SO JS, чтобы узнать, думают ли ониэто можно было бы сделать более эффективно, и @IvoWetzel предложил мне перейти на прототипированную оболочку для создания URL-запросов API, поэтому я посмотрел на нее, и он разместил этот пример кода на основе моего:

//API Handling for asynchronicity
function API(site, key, ...) {
    this.site = site;
    this.key = key;
    this.schedule = new Scheduler(this);
}

API.prototype = {
    lookup: function(resource, callback) {
        // build the url etc here
        this.request(url, callback);
    },

    request: function(url, callback) {
        // build a request here and send it
        request.on('finished', function() {
            callback();
        });
    }
};

function Scheduler(api) {
    return function(method, options, interval) {
        var id = null;
        function request() {
            api[method](options...);

            id = setTimeout(function() {
                request();

            }, interval);
        }

        return {
            stop: function(attribute) {
                clearTimeout(id);
            }
        }
    }
}

Очевидно, этоне закончен и только оболочка, но, честно говоря, кроме функции API в верхней части, я понятия не имею, как работает код, в частности lookup:, request: и как return function можетбыть внутри другого с переменными, которые нигде не определены и даже не переданы ему!

А функция Scheduler просто сбивает меня с толку ...

Вывод:


Итак, кто-то может объяснить простыми словами (подумайте, почему бы не положить гармошку в туалет 3-летнему ребенку), как приведенный выше код делает то же самое, что и код в мой репозиторий GitHub (строки 176-210, 243-245 и 277-365).

Примечание: я делаю это как упражнение по обучению JS, есливы говорите, используйте JQuery.parseJSON / libraryX. что бы я не скакалlp you:)

Спасибо всем!

Ответы [ 2 ]

7 голосов
/ 27 февраля 2011

Позволяет разбить его на части

//create function API which is meant to be instantiated into an object using 
///var foo = new API();
function API(site, key, ...) {
    this.site = site;
    this.key = key;
    this.schedule = new Scheduler(this);
}

//create two prototype functions on the API function called lookup & request
//these two functions will be available as public functions on all 
//instantiated API objects and can be called like this
//foo.lookup(resource, callback); / foo.request(url, callback);
API.prototype = {
    lookup: function(resource, callback) {
        // build the url etc here
        this.request(url, callback);
    },

    request: function(url, callback) {
        // build a request here and send it
        request.on('finished', function() {
            callback();
        });
    }
};
//define function Scheduler
function Scheduler(api) { 
    //when called, imidiately return a reference to an 
    //anonymous function that can be called later with 
    //the three arguments method, options & interval
    return function(method, options, interval) {
        // define a local variable id for this anonymous function
        var id = null;
        //create a private function inside the anonymous function call request
        function request() {
            //private function requests internals
            api[method](options...);

            id = setTimeout(function() {
                request();

            }, interval);
        }
        //when anonymous function is called return 
        //an object with a function called stop as property
        return {
            stop: function(attribute) {
                clearTimeout(id);
            }
        }
    }
}

В конце концов, вы сделаете что-то вроде этого:

var foo = new API();
var scheduler = foo.schedule('lookup', {some options object I presume}, some_interval);
scheduler.stop();
0 голосов
/ 27 февраля 2011

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

И функция планировщика просто сбивает меня с толку ...

  1. http://eloquentjavascript.net/chapter3.html
  2. Как работают закрытия JavaScript?
...