1

我学习 js 已经有一段时间了,我几乎了解它的主要概念,例如原型、oop……但是我不明白它是如何工作的:

User.findOne().where('socialid').equals(id).where('socialnetwork').equals(snw).exec(function (arr,data) {
    if(data){
    res.send(data);
    }
});

我不明白的是如何将dataarr变量传递给exec()函数内部的函数。是闭包吗?谁能给出一个更简单直观的例子,它是如何在幕后执行的?

编辑:实际上,我确实理解回调行为,我无法理解的是数据应该是User.findOne()....的结果,而不是来自exec()的回调函数内部,它只传递了新的exec()的函数,正如我在代码中看到的那样。

非常感谢

4

4 回答 4

4

的源代码exec将如下所示:

function exec(someCallback) {
    // ...
    var arr = /* ? */;
    var data = /* ? */;

    someCallback(arr, data);
    // ...
}
于 2013-09-25T17:08:49.603 回答
2

返回值和使用该值调用回调实际上非常相似!它的花哨名称是连续传递样式,实际上一些编程语言具有允许您以“常规样式”编写代码的功能(LISP 的 call/cc、C# 的异步等),但将其编译为后面的连续传递样式场景。

于 2013-09-25T17:18:06.787 回答
0

这些是常规参数。

它们在调用内部函数时传递,与调用任何其他函数的方式相同。

闭包是指内部函数可以从外部函数访问变量(例如,res

于 2013-09-25T17:08:30.763 回答
0

感谢您的所有回答,我理解了这个概念,这是我想与其他人分享的示例:

  function Person(){};

  Person.prototype = {
    constructor: Person,
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    friends : ["Shelby", "Court"],
    sayName : function () {
      console.log(this.name);
    },
    hello : function (callback) {
      console.log('calling back');
      age = this.age; 
      callback(age); //we can use this.age, but for learning purpose, this' better.
    }
  };
  var person1 = new Person();
  person1.hello(function(age){console.log(age + 50);})

因此,在回调中确定了年龄参数。

干杯

于 2013-09-25T19:19:49.220 回答