JavaScript中获取内部函数返回值问题求助
问题分析与解决方案
你的代码之所以弹出undefined,核心有两个问题:
f1函数没有返回值:f1内部只是调用了f2,但没有用return把任何结果传递出去,所以调用f1()时默认返回undefined。f2里的回调函数没有被执行:你把匿名函数传给了f2,但f2内部并没有调用这个函数,就算调用了,结果也没传递回f1。
接下来分两种场景给你解决办法:
场景1:f2是同步操作
如果f2里的逻辑是同步的,只需要让f2执行回调并返回结果,同时让f1返回f2的执行结果即可:
alert(f1()); function f1(){ // 返回f2的执行结果 return f2(function (){ return "some data"; }); } function f2(f4){ // 执行传入的回调函数,返回它的结果 return f4(); }
这样f2会执行你传入的匿名函数,拿到"some data"并返回,f1再把这个结果返回给alert,就能弹出正确的值了。
场景2:f2是异步操作(比如定时器、AJAX请求)
如果f2里包含异步逻辑,同步返回的方式就行不通了,这时候需要用回调函数或者Promise来处理:
用回调函数实现
// 把alert逻辑放到回调里,等异步操作完成后执行 f1(function(result) { alert(result); }); function f1(callback){ f2(function (){ // 异步操作完成后,把结果通过回调传递出去 callback("some data"); }); } function f2(f4){ // 模拟异步操作(比如定时器) setTimeout(() => { f4(); }, 100); }
用Promise实现(更推荐现代写法)
// 用.then处理异步结果 f1().then(result => { alert(result); }); function f1(){ return f2(); } function f2(){ return new Promise(resolve => { // 模拟异步操作 setTimeout(() => { // 把结果通过resolve传递出去 resolve("some data"); }, 100); }); }
如果你的环境支持async/await,还可以写成更简洁的形式:
async function showResult() { const result = await f1(); alert(result); } showResult(); function f1(){ return f2(); } function f2(){ return new Promise(resolve => { setTimeout(() => { resolve("some data"); }, 100); }); }
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

