JavaScript 中 apply 、call 的详解

发布时间 - 2026-01-11 00:16:36    点击率:

apply 和 call 的区别

ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已。

apply( )

apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作为函数参数所组成的数组。

var obj = {
 name : 'linxin'
}
function func(firstName, lastName){
 console.log(firstName + ' ' + this.name + ' ' + lastName);
}
func.apply(obj, ['A', 'B']); // A linxin B

可以看到,obj 是作为函数上下文的对象,函数 func 中 this 指向了 obj 这个对象。参数 A 和 B 是放在数组中传入 func 函数,分别对应 func 参数的列表元素。

call( )

call 方法第一个参数也是作为函数上下文的对象,但是后面传入的是一个参数列表,而不是单个数组。

var obj = {
 name: 'linxin'
}
function func(firstName, lastName) {
 console.log(firstName + ' ' + this.name + ' ' + lastName);
}
func.call(obj, 'C', 'D');  // C linxin D

对比 apply 我们可以看到区别,C 和 D 是作为单独的参数传给 func 函数,而不是放到数组中。

对于什么时候该用什么方法,其实不用纠结。如果你的参数本来就存在一个数组中,那自然就用 apply,如果参数比较散乱相互之间没什么关联,就用 call。

apply 和 call 的用法

1.改变 this 指向

var obj = {
 name: 'linxin'
}
function func() {
 console.log(this.name);
}
func.call(obj);  // linxin

我们知道,call 方法的第一个参数是作为函数上下文的对象,这里把 obj 作为参数传给了 func,此时函数里的 this 便指向了 obj 对象。此处 func 函数里其实相当于

function func() {
 console.log(obj.name);
}

2.借用别的对象的方法

先看例子

var Person1 = function () {
 this.name = 'linxin';
}
var Person2 = function () {
 this.getname = function () {
  console.log(this.name);
 }
 Person1.call(this);
}
var person = new Person2();
person.getname();  // linxin

从上面我们看到,Person2 实例化出来的对象 person 通过 getname 方法拿到了 Person1 中的 name。因为在 Person2 中,Person1.call(this) 的作用就是使用 Person1 对象代替 this 对象,那么 Person2 就有了 Person1 中的所有属性和方法了,相当于 Person2 继承了 Person1 的属性和方法。

3.调用函数

apply、call 方法都会使函数立即执行,因此它们也可以用来调用函数。

function func() {
 console.log('linxin');
}
func.call();   // linxin

call 和 bind 的区别

在 EcmaScript5 中扩展了叫 bind 的方法,在低版本的 IE 中不兼容。它和 call 很相似,接受的参数有两部分,第一个参数是是作为函数上下文的对象,第二部分参数是个列表,可以接受多个参数。

它们之间的区别有以下两点。

1.bind 发返回值是函数

var obj = {
 name: 'linxin'
}
function func() {
 console.log(this.name);
}
var func1 = func.bind(obj);
func1();      // linxin

bind 方法不会立即执行,而是返回一个改变了上下文 this 后的函数。而原函数 func 中的 this 并没有被改变,依旧指向全局对象 window。

2.参数的使用

function func(a, b, c) {
 console.log(a, b, c);
}
var func1 = func.bind(null,'linxin');
func('A', 'B', 'C');   // A B C
func1('A', 'B', 'C');   // linxin A B
func1('B', 'C');    // linxin B C
func.call(null, 'linxin');  // linxin undefined undefined

call 是把第二个及以后的参数作为 func 方法的实参传进去,而 func1 方法的实参实则是在 bind 中参数的基础上再往后排。

在低版本浏览器没有 bind 方法,我们也可以自己实现一个。

if (!Function.prototype.bind) {
 Function.prototype.bind = function () {
  var self = this,      // 保存原函数
   context = [].shift.call(arguments), // 保存需要绑定的this上下文
   args = [].slice.call(arguments); // 剩余的参数转为数组
  return function () {     // 返回一个新函数
   self.apply(context,[].concat.call(args, [].slice.call(arguments)));
  }
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # apply  # call  # 浅谈JavaScript中的apply/call/bind和this的使用  # Javascript中call  # bind方法的详解与总结  # 实例讲解JavaScript中call、apply、bind方法的异同  # 详解js中的apply与call的用法  # JS中改变this指向的方法(call和apply、bind)  # JavaScript中的apply()方法和call()方法使用介绍  # js中继承的几种用法总结(apply  # prototype)  # js apply/call/caller/callee/bind使用方法与区别分析  # js中call与apply的用法小结  # 第一个  # 组中  # 可以看到  # 就用  # 的是  # 而不是  # 是个  # 是在  # 放在  # 多个  # 基础上  # 什么时候  # 第二个  # 相互之间  # 会使  # 另外一个  # 绑定  # 拿到了  # 两部分  # 中不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel Fortify是什么,和Jetstream有什么关系  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel如何为API生成Swagger或OpenAPI文档  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何实现模型的全局作用域?(Global Scope示例)  网站优化排名时,需要考虑哪些问题呢?  如何用狗爹虚拟主机快速搭建网站?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何用已有域名快速搭建网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何挑选优质建站一级代理提升网站排名?  java中使用zxing批量生成二维码立牌  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何注册花生壳免费域名并搭建个人网站?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  微信小程序 input输入框控件详解及实例(多种示例)  C语言设计一个闪闪的圣诞树  nginx修改上传文件大小限制的方法  如何在Tomcat中配置并部署网站项目?  如何在 React 中条件性地遍历数组并渲染元素  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  怎么用AI帮你设计一套个性化的手机App图标?  新三国志曹操传主线渭水交兵攻略  企业网站制作这些问题要关注  详解Android——蓝牙技术 带你实现终端间数据传输  如何快速辨别茅台真假?关键步骤解析  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在宝塔面板中修改默认建站目录?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  JavaScript中的标签模板是什么_它如何扩展字符串功能  免费网站制作appp,免费制作app哪个平台好?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  微信小程序 canvas开发实例及注意事项  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  公司门户网站制作流程,华为官网怎么做?  如何用PHP快速搭建高效网站?分步指南  Laravel如何创建自定义中间件?(Middleware代码示例)  焦点电影公司作品,电影焦点结局是什么?  Python文件操作最佳实践_稳定性说明【指导】