原型和嵌套返回函数,求救!

时间:2011-02-26 22:12:41

标签: javascript json function prototype return

说明:


我知道“这段代码是如何工作的?”类型问题是不受欢迎的,我会看起来像读“太阳报”那样聪明地提出这样一个问题,但是......这里就是这样。

我试图理解JavaScript中的原型,现在这不是问题,我理解原型结构的基础知识,你编写一个函数,然后通过使用原型来扩展该函数的参数。

(在我发现火焰之前是的,我已经通过社区维基阅读了关于这个特定主题的帖子,所以不要只是告诉他们,以及我已经通过了John Reisg的笔记这个主题也有很大的帮助。(最令人困惑的方面是理解this及其DOM引用方法。))

但事情就是这样:


我为SO API编写了一个简单的API解析器,可以提取各种数据,自己和我第一次冒险进入JS我在SO JS Chatroom中发布了一个链接,看看他们是否认为这可以做得更多有效地和@IvoWetzel建议我更改为原型包装器以创建API URL查询,所以我调查了它并且他基于我发布了这个示例代码:

//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);
            }
        }
    }
}

显然这还没有完成,只有一个shell,但是老实说除了顶部的API函数之外我不知道代码是如何工作的,特别是lookup:,{ {1}}以及request:如何在另一个内部使用未在任何地方定义或甚至传递给它的变量!

return function函数让我感到困惑......

结论:


那么,有人可以用简单的语言解释(想想解释为什么不将口琴放入厕所给3岁的孩子)上面的代码如何与my GitHub repo中的代码相同(第176行 - 210,243-245和277-365)。

N.B:如果你说使用JQuery.parseJSON / libraryX,我正在做这个JS学习练习。无论我会怎样剥夺你的头脑:)

全部谢谢!

2 个答案:

答案 0 :(得分:7)

让我们把它分解成它的部分

//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();

答案 1 :(得分:0)

  

返回函数如何在里面   另一个变量不是   定义在任何地方甚至传递给它!

     

调度程序功能只有我   普通的老人莫名其妙......

  1. http://eloquentjavascript.net/chapter3.html
  2. How do JavaScript closures work?