新闻中心

JS中call, apply, bind方法的区别与实现_j*ascript技巧

2025-11-06
浏览次数:
返回列表
call和apply立即执行函数并改变this指向,区别在于参数传递方式;bind返回绑定后的新函数,可延迟调用且支持柯里化。

js中call, apply, bind方法的区别与实现_javascript技巧

在J*aScript中,callapplybind 都是用来改变函数执行时的上下文,也就是我们常说的 this 指向。虽然它们的功能相似,但在使用方式和返回结果上有明显区别。

1. call 与 apply:立即执行并改变 this 指向

callapply 都会立即调用函数,并将函数内部的 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 BrandCrowd

一个在线Logo免费设计生成器

BrandCrowd 200 查看详情 BrandCrowd

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全栈特性:选择与部署策略 

搜索