0
exports.list = function(callback){

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

Q:上記のコードがクロージャーであるのはなぜですか?callback関数パラメーターがネストされた関数を呼び出すためですか?

Q:関数はパラメーターを介して自分自身を呼び出しているため、これにより無限ループが発生しますか?

Q:上記の関数は、callbackどこにも定義されていない場合は機能しますか?

4

3 に答える 3

1

他の人はすでにあなたの質問のほとんどに答えています。しかし、あなたのコメントから、あなたはまだ最後の質問について混乱しているかもしれないことがわかります:

  • Q:コールバックがどこにも定義されていない場合、上記の関数は機能しますか?

回答: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()コールバックは技術的には「定義」されますが、その値は関数ではありません。

于 2012-11-02T21:32:10.137 に答える
0

callbackに割り当てられた関数スコープを囲むことからmodel.find()コード内にキャプチャされるため、これはクロージャですexports.list

于 2012-11-02T20:36:08.220 に答える
0

Q:上記のコードがクロージャーであるのはなぜですか?関数パラメーターが、ネストされている関数コールバックを呼び出すためですか?

A: Mikeが説明したように、関数内で外部変数を使用すると、クロージャを作成します。

Q:これにより無限ループが発生しますか

A:モデルに対して一度だけ発砲すると思いfunction(err, objects)ますので、発砲しません。callee(または自分自身を)呼び出すと、無限ループが発生します

Q:コールバックがどこにも定義されていない場合、上記の関数は機能しますか?

A:エラーが発生しますReferenceError: callback is not defined

于 2012-11-02T21:18:33.577 に答える