我是Node.js平台的新手,我尽可能多地学习。玩回调后,有一件事让我很困惑:
所以,我有这个功能:
function registerUser(body, res, UserModel){
var userJSON = {
email : body.email,
password : body.password,
accessToken : null
};
var user = null;
var userAlreadyExists = false;
UserModel.find({}).select('email').exec(function(err, results){
if(err){
console.log('Database error : ' + err);
// send the appropriate response
}else{
for(var index in results){
if(results[index].email == userJSON.email){
userAlreadyExists = true;
break;
}
}
if(userAlreadyExists){
// send the appropriate response
}else{
newAccessToken(UserModel, function(error, token){
if(error != null){
// handle the error
}else{
userJSON.accessToken = token;
user = new UserModel(userJSON);
user.save(function(err){
if(err){
// .. handle the error
}else{
// .. handle the registration
}
});}});}}});}
然后是接受回调的函数:
function newAccessToken(UserModel, callback){
UserModel.find({}).select('email accessToken').exec(function(err, results){
if(err){
callback(err, null);
}else{
// .... bunch of logic for generating the token
callback(null, token);
}
});
}
我希望回调不起作用(可能会抛出错误),因为user
和userJSON
都没有在它的上下文中定义。(好吧,那不是确实如此,但由于它是异步执行的 - 经过一段时间 - 我希望回调失去它对那些在registerUser
函数中本地定义的变量的引用。相反,这个例子工作得很好,回调函数使用registerUser
函数中定义的那两个变量来保持它的引用。有人可以解释一下异步回调和引用是如何工作的以及为什么这个例子有效?
答案 0 :(得分:2)
而不是回调,这些被称为闭包,而在JavaScript中,范围处理是特殊的。查看此文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
答案 1 :(得分:1)
H i,你要跟回的函数 在你试图访问的变量的范围内,所以很有可能去访问它们。
这不是nodejs的事情,常规JS的工作方式相同。
差异
1)将无法访问名为'foo'的var
function finishfunction() {
console.log(foo); /* undefined */
}
function functionwithcallback(callback) {
callback();
}
function doStuff() {
var foo = "bar";
functionwithcallback(finishfunction);
}
doStuff();
2)和你一样,访问'foo'很好。
function functionwithcallback(callback) {
callback();
}
function doStuff() {
var foo = "bar";
functionwithcallback(function() {
console.log(foo) /* all fine */
});
}
doStuff();