前端学习手册-JavaScript函数与回调(十一)

一、函数的定义

function hello() {
    console.log("你好!");
}
hello();

二、带参数和返回值

function add(x, y) {
    return x + y;

let result = add(1, 2);
console.log(result); // 输出3

三、箭头函数(ES6新语法)

const multiply = (a, b) => a * b;
console.log(multiply(2, 3)); // 6

四、函数表达式

const add = function(x, y) {
  return x + y;
};
console.log(add(1, 2));//输出3

五、匿名函数(没有名字的函数)

setTimeout(function() {
  console.log('延迟1秒输出');
}, 1000);

六、回调函数

回调函数是作为参数传递给另一个函数的函数,在特定事件或条件发生时被调用。

回调函数本质上是一个函数,作为另一个函数的参数。

1.使用命名函数作为回调

2.使用匿名函数作为回调

3.使用箭头函数作为回调(ES6+)

// 形式1:使用命名函数作为回调
function greeting(name) {
  return `Hello, ${name}!`;
}

function processUserInput(input, callback) {
  const formattedInput = input.trim();
  return callback(formattedInput);
}
// 将greeting函数作为回调传递
const result1 = processUserInput('  World  ', greeting);
console.log('命名函数作为回调的结果:', result1);

// 形式2:使用匿名函数作为回调
const result2 = processUserInput('JavaScript', function(name) {
  return `Welcome to ${name}!`;
});
console.log('匿名函数作为回调的结果:', result2);

// 形式3:使用箭头函数作为回调(ES6+)
const result3 = processUserInput('ES6', (name) => {
  return `Learning ${name} arrow functions!`;
});
console.log('箭头函数作为回调的结果:', result3);

常见使用场景:

1. 异步API调用(如AJAX请求、文件读写等)

2. 事件处理(如点击事件、键盘事件等)

3. 数组的高阶函数(如forEach、map、filter等)

4. 定时器函数(如setTimeout、setInterval等)

下面是一段嵌套回调的代码示例:

// 嵌套回调与回调地狱
// 模拟异步操作的函数
function fetchUserData(userId, callback) {
  setTimeout(() => {
    console.log(`获取用户${userId}数据`);
    callback({ id: userId, name: `User${userId}` });
  }, 200);
}
function fetchUserPosts(userData, callback) {
  setTimeout(() => {
    console.log(`获取用户${userData.name}的帖子`);
    callback([
      { id: 1, title: `Post by ${userData.name}` },
      { id: 2, title: `Another post by ${userData.name}` }
    ]);
  }, 200);
}
function fetchPostComments(posts, callback) {
  setTimeout(() => {
    console.log(`获取帖子的评论`);
    callback([
      { id: 101, postId: 1, content: 'Great post!' },
      { id: 102, postId: 1, content: 'Thanks for sharing' }
    ]);
  }, 200);
}
// 回调地狱示例(多层嵌套的回调函数)
console.log('回调地狱示例开始:');
fetchUserData(1, (userData) => {
  fetchUserPosts(userData, (posts) => {
    fetchPostComments(posts, (comments) => {
      console.log('所有异步操作完成!');
      console.log('用户:', userData);
      console.log('帖子:', posts);
      console.log('评论:', comments);
      console.log('注意:这种多层嵌套的结构就是回调地狱,代码可读性很差');
    });
  });
});

多层嵌套会导致回调地狱,应尽量避免。

回调地狱问题

多层嵌套导致代码可读性差

思考:那怎么解决回调地狱问题呢?使代码更优雅可读性更强?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值