JavaScript 中call和apply的详细讲解 —— 连10岁的小朋友都能看懂!

🌟 一、先搞清楚"函数"和"this"是什么

✅ 函数(Function)

函数就像一个"小机器人",你告诉它做什么,它就去做。比如:

javascript 复制代码
function sayHi() {
  console.log("你好!");
}
sayHi(); // 输出:你好!

✅ this 是什么?

this 就像一个"遥控器",指向当前正在使用这个函数的对象。

javascript 复制代码
const 小明 = {
  name: "小明",
  sayName: function() {
    console.log("我是" + this.name);
  }
};

小明.sayName(); // 输出:我是小明

这里的 this 指向"小明"这个对象。

🧩 二、问题来了:如果我想让"小红"也用"小明"的 sayName 函数怎么办?

这时候就需要 callapply !它们的作用是:临时借用别人的函数,并指定"this"是谁

🔍 三、call 的基本用法

📌 语法:

javascript 复制代码
函数.call(新的this对象, 参数1, 参数2, ...)

👶 举个超简单的例子:

javascript 复制代码
function greet() {
  console.log("你好,我是 " + this.name);
}

const 小明 = { name: "小明" };
const 小红 = { name: "小红" };

greet.call(小明); // 输出:你好,我是 小明
greet.call(小红); // 输出:你好,我是 小红

👉 callgreet 函数借给小明/小红用,并让 this 指向他们!

🔍 四、apply 的基本用法

📌 语法:

javascript 复制代码
函数.apply(新的this对象, [参数数组])

注意:参数要用数组传进去!

👶 例子(带参数):

javascript 复制代码
function introduce(age, hobby) {
  console.log(`我是 ${this.name},今年 ${age} 岁,喜欢 ${hobby}`);
}

const 小刚 = { name: "小刚" };

// 用 call:
introduce.call(小刚, 10, "打篮球");
// 输出:我是 小刚,今年 10 岁,喜欢 打篮球

// 用 apply(参数必须放数组里):
introduce.apply(小刚, [10, "打篮球"]);
// 输出:我是 小刚,今年 10 岁,喜欢 打篮球

总结区别:

  • call:一个个写参数 → func.call(obj, a, b, c)
  • apply:把参数打包成数组 → func.apply(obj, [a, b, c])

... [省略了部分内容以保持简洁]

🎁 八、终极总结(一句话记住)

callapply 就是"借函数 + 指定主人(this)"的魔法咒语!

  • call:参数一个个说。
  • apply:参数打包成数组说。

🧪 九、动手练习(试试看!)

javascript 复制代码
function describe(color, size) {
  console.log(`${this.item} 是 ${color} 色,尺寸是 ${size}`);
}

const shirt = { item: "T恤" };
const hat = { item: "帽子" };

// 请用 call 和 apply 分别让 shirt 和 hat 描述自己!
describe.call(shirt, "红", "L");
describe.apply(hat, ["蓝", "M"]);

输出:

复制代码
T恤 是 红 色,尺寸是 L
帽子 是 蓝 色,尺寸是 M
相关推荐
2601_949809592 分钟前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
Up九五小庞13 分钟前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
摘星编程36 分钟前
React Native + OpenHarmony:UniversalLink通用链接
javascript·react native·react.js
qq_177767371 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88211 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
程序员清洒3 小时前
Flutter for OpenHarmony:Text — 文本显示与样式控制
开发语言·javascript·flutter
雨季6663 小时前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
会飞的战斗鸡4 小时前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling4 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
qq_177767374 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos