异步JavaScript允许耗时操作后台运行而不阻塞主线程,通过回调函数等机制实现非阻塞执行,避免页面卡死;常见操作有fetch、setTimeout等,回调地狱催生了Promise和async/await。

异步 JavaScript 是指代码不按书写顺序逐行阻塞执行,而是允许某些耗时操作(比如网络请求、文件读取、定时器)在后台运行,同时让其他代码继续执行,避免页面卡死。回调函数是实现异步的一种基础方式——它是一个被当作参数传给另一个函数的函数,在特定事件完成或条件满足时被自动调用。
为什么需要异步?
浏览器是单线程的,如果所有任务都同步执行,遇到一个要等 2 秒的网络请求,整个页面就会卡住 2 秒,用户点不了按钮、打不了字。异步让 JS 能“先干别的事,等结果回来再处理”,保持界面响应流畅。
常见异步操作包括:
• fetch() 请求数据
• setTimeout() 延迟执行
• addEventListener() 等待用户点击
• 读取文件(Node.js 中的 fs.readFile)
回调函数长什么样?
回调函数本身没有特殊语法,就是一个普通函数,只是“被别人调用”的时机由外部逻辑决定。比如:
setTimeout(function() { console.log("2秒后执行"); }, 2000);
立即学习“Java免费学习笔记(深入)”;
再比如用回调处理 AJAX(老式写法):
function loadData(callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data');
xhr.onload = function() {
if (xhr.status === 200) {
callback(null, JSON.parse(xhr.responseText));
} else {
callback(new Error('请求失败'));
}
};
xhr.send();
}
loadData(function(err, data) {
if (err) console.error(err);
else console.log(data);
});
回调地狱(Callback Hell)是什么?
当多个异步操作需要串行执行(比如:取用户 → 取用户订单 → 取订单商品),用纯回调就会层层嵌套,代码向右偏移严重,难读难维护:
getUser(function(user) {
getOrders(user.id, function(orders) {
getProducts(orders[0].id, function(products) {
console.log(products);
});
});
});
这问题催生了 Promise 和 async/await,它们不是取代回调,而是更清晰地组织回调逻辑。
回调函数的关键注意点
• 回调不一定立刻执行,它取决于触发它的异步操作何时完成
• 错误优先(Error-First)是 Node.js 风格回调的常见约定:第一个参数是错误对象,后续才是成功数据
• 不要忘记处理错误,否则异常可能静默丢失
• 回调中 this 指向容易出错,必要时用箭头函数或 .bind() 固定
基本上就这些。回调是理解异步的起点,虽然现在更多用 Promise 和 await,但底层机制和思维逻辑依然建立在回调之上。
以上就是什么是异步JavaScript和回调函数?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1542880.html
微信扫一扫
支付宝扫一扫