首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与node.js代码相关的混淆

与node.js代码相关的混淆
EN

Stack Overflow用户
提问于 2013-02-16 12:04:44
回答 2查看 79关注 0票数 0

我发现这段代码说我可以异步运行一些db查询。

代码语言:javascript
复制
var queries = [];


for (var i=0;i <1; i++) {
  queries.push((function(j){
    return function(callback) {
      collection.find(
    {value:"1"},

    function(err_positive, result_positive) {
       result_positive.count(function(err, count){
         console.log("Total matches: " + count);
         positives[j] = count;          
         callback();
       });
    }

      );
    }
  })(i));
}

async.parallel(queries, function(){
  // do the work with the results
}

我不明白什么是回调函数,它是怎么定义的?第二,在queries.push中,它传递函数(J)这个函数中的j是什么,这个(i)是什么

代码语言:javascript
复制
queries.push((function(j){})(i));

我完全搞不懂这段代码是如何工作的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-16 15:59:33

该循环正在准备一组与async.parallel()tasks几乎相同的函数。

在循环之后,如果它当前只迭代一次,queries将类似于:

代码语言:javascript
复制
var queries = [
    function (callback) {
        collection.find(
            // etc.
        );
    }
];

并且,对于每个额外的迭代,都会添加一个新的function (callback) { ... }

什么是回调函数?它是如何定义的?

callback只是每个函数的命名参数。它的值将由async.parallel()定义为另一个function,当被调用时,它允许async知道每个任务何时完成。

queries.push中的第二个函数,它传递函数(J),这个函数中的j是什么,这个(i)是什么

queries.push((function(j){})(i));

(function(j){})(i)是一个以j作为命名参数的Immediately-Invoked Function Expression (IIFE),它通过i作为传递的参数立即被调用,并返回一个新的function (callback) {},该The将被pushqueries

代码语言:javascript
复制
queries.push(
    (function (j) {
        return function (callback) {
            // etc.
        };
    })(i)
);

IIFE的目的是创建一个closure --一个带有局部变量的词法作用域,该作用域“粘住”在作用域中定义的任何function。这允许每个function (callback) {}都有自己的j,只有一个值i (因为i将随着for循环的继续而继续改变值)。

票数 1
EN

Stack Overflow用户

发布于 2013-02-16 12:22:40

回调是最酷的特性之一。回调只是另一个普通的函数。实际上,您可以将函数本身作为参数传递到另一个函数中。假设foo()函数做了一些事情。在foo()执行完之后,您可能想立即执行一些其他的东西。因此,为了实现这一点,您定义了一个函数bar(),并将此函数作为参数传递给函数foo()!

代码语言:javascript
复制
function foo(callback){
  // do something
  callback();
}

function bar(){
  // do something else
}

foo(bar());
//here we can see that a function itself is being passed as a param to function foo.

想要更多地了解here的正确链接。

代码语言:javascript
复制
queries.push((function(j){})(i));

在javascript中,这是调用函数的另一种方式。

代码语言:javascript
复制
function(){
// do something.
}();

您实际上不需要定义函数名,并且可以在没有名称的情况下直接调用它。您甚至可以将参数传递给它。

代码语言:javascript
复制
function(a){
alert(a)'
}(10);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14906806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档