html5 - javascript 回调函数 入门问题
PHPz
PHPz 2017-04-10 17:10:13
[JavaScript讨论组]
var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

为什么cb可以取到 connect的返回值? cb不是在connect里面吗?

cb是在connect return后执行?还是之前执行的?

如果是之前执行,那怎么取到db?因为还没return。

PHPz
PHPz

学习是最好的投资!

全部回复(6)
阿神

先分析题主的这个方法:

var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

mongoose.connect的结果要赋给db, 所以这个函数里一定会有个return。
但是我们知道return执行之后函数执行就会停止。

如果这个回调,也就是:

function(){
    cb(db);
}

是在return前调用,那么执行cb(db)时,db尚未获取return的结果。
如果在return后调用, 那么就根本不会执行。

当然上面的推论都是在函数顺序执行的前提下。
所以这里是另一种情况:
就是这个函数虽然在return前调用,但是其执行时db已有return了的结果。
也就是说,这个函数是异步调用的。

假设mongoose.connect是这样的一个函数,那么就可以在自身return之后,获取自身的值。

mongoose.connect = function(uri,callback){
  setTimeout(function(){
    callback && callback()
  },0) ;
  return 'db connect succeed!';
}
黄舟

之后
回调的意思就是操作完成后,将结果传入回调函数并执行。
在这段代码中,先会执行connect,操作完成后执行function(){cb(db);}

天蓬老师

之后,在连接建立时执行

巴扎黑

如果表达式的右边是一个可执行的方法或者函数都是先执行再进行赋值的,所以cb不可能取得db的值,你并没有贴出connect方法的具体context。如果connect方法的回调函数可以取得db的值,有一种可能是延迟执行的。就像这样:

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);
巴扎黑
var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

get函数体中,
首先声明了一个变量db,然后mongoose.connect方法被执行,做为同步代码执行完成后返回一个值赋值给db变量,然后get函数返回。
但是因为connnet作为一个异步方法,运行的实际结果反映在connet方法绑定的回调函数中,回调函数定义涉及到一个闭包作用域的问题,这个回到函数将绑定get函数体中定义的变量db;那么当get函数执行返回后,db变量不会被释放掉。

当connect回调发生时,也就是connet得到实际执行记过后,将调用定义的回调函数~~~

PHP中文网

db 与 cb 都在 get函数作用域中,
所以 cb(db)是有效的.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号