关于Javascript函数里面的函数说明?

我已经了解了一段时间了,我几乎了解它的主要概念,如原型,OOP …但我不明白这是如何工作的:

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

我不明白的是如何将数据arrvariables传递给exec()函数中的函数。 这是封闭吗? 任何人都可以给出一个更简单直观的例子,它是如何在幕后执行的?

编辑 :其实,我明白了callback行为,我不明白的是数据应该是由User.findOne()的结果….不是从exec()的callback函数内部,它只是通过新函数的exec() ,我可以在代码中看到。

非常感谢

exec的源代码如下所示:

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

返回一个值并用这个值调用callback实际上是非常相似的! 它的花哨名称是Continuation Passing Style ,实际上一些编程语言有一些特性(LISP的call / cc,C#的async等),可以让你用“常规风格”编写代码,但是编译后继续传递场景。

这些是常规参数。

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

闭包是指内部函数可以访问来自外部函数的variables(例如res

感谢你的答案,我理解了这个概念,下面是我想为其他人分享的例子:

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

所以, 年龄参数在callback中被确定。

干杯