我已经学习了一段时间的js,我几乎了解它的主要概念,比如原型,oop ......但是我无法理解它是如何工作的:
User.findOne().where('socialid').equals(id).where('socialnetwork').equals(snw).exec(function (arr,data) {
if(data){
res.send(data);
}
});
我不明白的是数据和 arr 变量如何传递到 exec()<中的函数 / em>功能。是关闭吗?任何人都可以提供一个更简单直观的例子,它是如何在幕后执行的吗?
已编辑:实际上,我确实理解回调行为,我无法理解数据应该是 User.findOne()的结果.... 不是来自 exec()的回调函数,它只将新函数传递给 exec(),正如我在代码。
非常感谢
答案 0 :(得分:4)
exec
的源代码如下所示:
function exec(someCallback) {
// ...
var arr = /* ? */;
var data = /* ? */;
someCallback(arr, data);
// ...
}
答案 1 :(得分:2)
返回一个值并使用该值调用回调实际上非常相似!它的奇特名称是Continuation Passing Style,实际上有些编程语言有一些功能(LISP的调用/ cc,C#的异步等),可以让你以“常规风格”编写代码,但将其编译成延续传递风格在幕后。
答案 2 :(得分:0)
这些是常规参数。
在调用内部函数时传递它们,与调用任何其他函数的方式相同。
闭包是指内部函数可以从外部函数访问变量的事实(例如,res
)
答案 3 :(得分: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);})
因此,在回调中确定了年龄参数。
干杯