新闻中心
JS中call, apply, bind方法的区别与实现_j*ascript技巧
call和apply立即执行函数并改变this指向,区别在于参数传递方式;bind返回绑定后的新函数,可延迟调用且支持柯里化。

在J*aScript中,call、apply 和 bind 都是用来改变函数执行时的上下文,也就是我们常说的 this 指向。虽然它们的功能相似,但在使用方式和返回结果上有明显区别。
1. call 与 apply:立即执行并改变 this 指向
call 和 apply 都会立即调用函数,并将函数内部的 this 绑定为指定对象。
它们的区别在于传参方式:
- call(thisArg, arg1, arg2, ...):参数逐个传递
- apply(thisArg, [argsArray]):第二个参数是数组或类数组对象
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
<p>const person = { name: 'Alice' };</p><p>greet.call(person, 'Hello', '!'); // 输出:Hello, Alice!
greet.apply(person, ['Hi', '?']); // 输出:Hi, Alice?</p>2. bind:返回新函数,不立即执行
bind 不会立即执行原函数,而是返回一个新函数,这个新函数的 this 被永久绑定到指定对象。
绑定后,无论之后如何调用该函数,this 都不会改变。
示例:
const boundGreet = greet.bind(person, 'Hey');
boundGreet('.'); // 输出:Hey, Alice.
bind 还支持柯里化(partial application),即预先传入部分参数。
BrandCrowd
一个在线Logo免费设计生成器
200
查看详情
3. 核心区别总结
- call / apply:立即执行函数,this 被临时绑定
- bind:返回绑定后的新函数,可延迟调用
- 参数传递:call 用逗号分隔,apply 用数组
4. 手动实现这三个方法
理解原理有助于深入掌握 this 机制。
实现 call
Function.prototype.myCall = function(context, ...args) {
context = context || window;
const fnSymbol = Symbol();
context[fnSymbol] = this;
const result = context[fnSymbol](...args);
delete context[fnSymbol];
return result;
};
实现 apply
Function.prototype.myApply = function(context, args = []) { context = context || window; const fnSymbol = Symbol(); context[fnSymbol] = this; const result = context[fnSymbol](...args); delete context[fnSymbol]; return result; };
实现 bind
Function.prototype.myBind = function(context, ...bindArgs) {
const fn = this;
const boundFn = function(...args) {
// 判断是否被 new 调用
return fn.apply(
this instanceof boundFn ? this : context,
bindArgs.concat(args)
);
};
// 继承原型
if (this.prototype) {
boundFn.prototype = Object.create(this.prototype);
}
return boundFn;
};
注意:bind 的实现需要处理 new 调用的情况,此时 this 应指向新创建的实例,而不是绑定的对象。
基本上就这些。掌握 call、apply、bind 的区别和原理,对理解 J*aScript 的 this 机制和函数式编程非常有帮助。实际开发中,bind 常用于事件回调,call/apply 多用于借用方法或数组操作。手动实现能加深理解,面试也常考。不复杂但容易忽略细节。
以上就是JS中call, apply, bind方法的区别与实现_j*ascript技巧的详细内容,更多请关注其它相关文章!
# 但在
# 抗癌药的营销与推广
# 家装业务推广网站
# 甘肃网站优化建设
# 海南网站建设需要
# 佛山网站优化关键词费用
# 河西区如何推广网站产品
# 青海seo优化的好方法
# 湖北商品seo推广
# 掇刀seo推广介绍
# 江西营销网站推广前景
# 柯里
# 上有
# js
# 加载
# 都是
# 按需
# 服务端
# 如何用
# 如何使用
# 绑定
# 区别
# win
# app
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
Spyder启动失败:字体文件权限拒绝错误解决方案
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
Go语言中高效处理x-www-form-urlencoded表单数据
怎么在mac上运行html代码_mac运行html代码方法【指南】
海棠电脑版入口_通过电脑访问海棠官网阅读
响应式图片在网页设计中的正确实现方法
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
Pandas DataFrame 多条件优先级排序与排名
ArrayList与LinkedList操作复杂度详解:遍历与修改
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
微博网页版直接访问 微博网页版账号管理快速入口
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
Excel Power Pivot如何处理XML数据源 构建高级数据模型
网站内容防复制粘贴的实现策略与局限性
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版
PHP URL参数传递与500错误调试指南
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
ACG动漫视频网入口 ACG动漫*免费正版观看地址
AO3最新入口2025公告_AO3中文官网合集
机器学习中对数变换预测结果的反向还原
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
C++ vector二维数组定义_C++ vector of vector用法
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
mc.js游戏直达 mc.js网页免下载版本秒进地址
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
Python实时数据流中的动态最值查找策略
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
UC浏览器网页版登录入口官网 电脑版网址入口
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
谷歌google账号怎么注册账号 谷歌账号注册官方流程
微信聊天记录怎么加密_微信聊天记录加密方法
J*aScript中针对特定容器内图片动画的实现教程
2026春节假期票务安排_2026春节放假购票指南
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略


2025-11-06
浏览次数:次
返回列表
ontext, args = []) {
context = context || window;
const fnSymbol = Symbol();
context[fnSymbol] = this;
const result = context[fnSymbol](...args);
delete context[fnSymbol];
return result;
};