javascript中的意外闭包结果

javascript中的意外闭包结果,javascript,closures,Javascript,Closures,Q:为什么上面的代码是一个闭包?这是因为函数参数调用嵌套在其中的函数回调 Q:这是否会导致无限循环,因为函数通过其参数调用自身 Q:如果没有在任何地方定义回调,上述函数是否有效?这是一个闭包,因为回调是在模型内部捕获的。从指定给导出的封闭函数作用域中查找()代码。listQ:为什么上述代码是闭包?是不是因为函数参数调用嵌套在其中的函数回调 A:正如Mike所解释的,一旦函数内部使用了外部变量,就创建了一个闭包 Q:这会导致无限循环吗 A:我假设函数(err,objects)只会为模型触发一次,所

Q:为什么上面的代码是一个闭包?这是因为函数参数调用嵌套在其中的函数
回调

Q:这是否会导致无限循环,因为函数通过其参数调用自身


Q:如果没有在任何地方定义
回调
,上述函数是否有效?

这是一个闭包,因为
回调
是在模型内部捕获的。从指定给
导出的封闭函数作用域中查找()代码。list
Q:为什么上述代码是闭包?是不是因为函数参数调用嵌套在其中的函数回调

A:正如Mike所解释的,一旦函数内部使用了外部变量,就创建了一个闭包

Q:这会导致无限循环吗

A:我假设
函数(err,objects)
只会为模型触发一次,所以不会。如果调用
被调用方
(或self),则会创建一个无限循环

Q:如果没有在任何地方定义回调,上述函数是否可以工作


A:您将收到一个错误
ReferenceError:回调未定义

其他人已经回答了您的大部分问题。但是,从您的评论中,我看到您可能仍然对最后一个问题感到困惑:

  • Q:如果没有在任何地方定义回调,上述函数是否可以工作
回答:
回调
已在上述代码中定义。这里定义了
回调

exports.list = function(callback){

  var result = model.find({}, function(err, objects){
    callback(null, objects)
  });
  return result;
}

exports.list=函数(回调){//是的,我得到了捕获的位。但是它现在是函数的一个参数,而不是被
list
范围之外的其他函数调用的
callback
示例。此示例只希望您调用绑定到exports的list函数并将回调传递给它。类似于
exports.list(函数(arg1,objList){console.log(“stuff”);})
我明白了。换句话说,我必须定义
回调
对吗?因为我看不到它在其他地方被定义为函数。是的,你需要提供回调。exports.list函数只会使用你传递给它的任何回调来做一些设置,或者在调用你给它的自定义代码之前先使用任何回调。@bounkinghipo:
callback
已经在您的代码中定义。这里:
exports.list=function(callback){//有人可能会认为所有的JS函数都是闭包,因为如果您想要其中的变量,父作用域会自动存在(您无需额外工作)。有些只是不使用这些变量(现在)。非常感谢,这确实消除了我的困惑,因为我来自Java背景,必须定义带参数的函数。干杯!参考@slebetman的答案,我还会得到
引用错误:如果调用
exports.list()
,则回调未定义
exports.list()
,其中
callback
未在其他地方定义
exports.list = function(callback){ // <---- the callback variable defined here

  var result = model.find({}, function(err, objects){
    callback(null, objects) // <-- callback is used here
  });
  return result;
}