function Obj(){
this.connect=function(a,b){
setTimeout(function(){b()},1000);
return a;
}
};
var uri="your name";
var mongoose=new Obj();
function cb(c){
console.log(c);
return c;
}
var get=function(cb){
var db=mongoose.connect(uri,function(){cb(db)})
console.log(db);
}
get(cb);
先分析题主的这个方法:
mongoose.connect
的结果要赋给db, 所以这个函数里一定会有个return。但是我们知道return执行之后函数执行就会停止。
如果这个回调,也就是:
是在return前调用,那么执行
cb(db)
时,db尚未获取return的结果。如果在return后调用, 那么就根本不会执行。
当然上面的推论都是在函数顺序执行的前提下。
所以这里是另一种情况:
就是这个函数虽然在return前调用,但是其执行时db已有return了的结果。
也就是说,这个函数是异步调用的。
假设
mongoose.connect
是这样的一个函数,那么就可以在自身return之后,获取自身的值。之后
回调的意思就是操作完成后,将结果传入回调函数并执行。
在这段代码中,先会执行connect,操作完成后执行
function(){cb(db);}
之后,在连接建立时执行
如果表达式的右边是一个可执行的方法或者函数都是先执行再进行赋值的,所以cb不可能取得db的值,你并没有贴出connect方法的具体context。如果connect方法的回调函数可以取得db的值,有一种可能是延迟执行的。就像这样:
get函数体中,
首先声明了一个变量db,然后
mongoose.connect
方法被执行,做为同步代码执行完成后返回一个值赋值给db变量,然后get函数返回。但是因为connnet作为一个异步方法,运行的实际结果反映在connet方法绑定的回调函数中,回调函数定义涉及到一个闭包作用域的问题,这个回到函数将绑定get函数体中定义的变量db;那么当get函数执行返回后,db变量不会被释放掉。
当connect回调发生时,也就是connet得到实际执行记过后,将调用定义的回调函数~~~
db 与 cb 都在 get函数作用域中,
所以 cb(db)是有效的.