意外关闭导致javascript

时间:2012-11-02 20:33:03

标签: javascript closures

exports.list = function(callback){

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

:为什么上面的代码是封闭的?是因为函数参数调用嵌套在其中的函数callback吗?

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

:如果callback未在任何地方定义,上述功能是否有效?

3 个答案:

答案 0 :(得分:1)

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

  • 问:如果没有在任何地方定义回调,上述功能会起作用吗?

答案:callback已经在上面的代码中定义。这里是定义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;
}

现在,根据“已定义”一词的严格含义,回调被定义为eports.list()的参数。如果你传递函数以外的任何东西(或什么都没有),exports.list()回调在技术上仍然会被“定义”,但它的值不是函数。

答案 1 :(得分:0)

它是一个闭包,因为callback是在封闭了分配给exports.list的函数作用域的model.find()代码中捕获的。

答案 2 :(得分:0)

问:为什么上面的代码是封闭的?是因为函数参数调用嵌套在其中的函数回调吗?

答:正如Mike解释的那样,一旦在函数内使用了外部var,就会创建一个闭包。

问:这会导致无限循环

答:我认为function(err, objects)只会为模型触发一次,所以不会。如果你拨打callee(或自我)

,你会创建一个无限循环

问:如果没有在任何地方定义回调,上述功能会起作用吗?

A:您将收到错误ReferenceError: callback is not defined