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文件操作最佳实践_稳定性说明【指导】

