当前位置: 首页 > news >正文

Js中call、apply和bind的区别

call、apply和bind三个方法都可以用来改变函数的this指向

call()

call( ) 是接收一个及其以上的参数,第一个参数表示this要指向的对象,其余参数表示调用函数需要传入的参数,返回调用函数的返回结果,属于立即执行函数

apply()

apply( ) 是接收两个参数,第一个参数表示this要指向的对象,第二参数表示调用函数需要传入的参数所组成的数组,返回调用函数的返回结果,属于立即执行函数

bind()

bind( ) 是接收一个及其以上的参数,和call()一致,但是其返回是一个函数,而不是调用函数的返回结果。

区别 

相同点

都是改变this的指向,传入的第一个参数都是绑定this的指向,在非严格模式中,如果第一个参数是null或者undefined,会把全局对象(浏览器是window)作为this的值,要注意的是,在严格模式中,null 就是 null,undefined 就是 undefined

不同点

call和apply唯一的区别

call传入的是参数列表,apply传入的是数组,也可以是类数组

bind和call、apply的区别

bind返回的是一个改变了this指向的函数,便于稍后调用,不像call和apply会立即调用;bind和call很像,传入的也是参数列表,但是可以多次传入,不需要像call,一次传入

当 bind 返回的函数 使用new作为构造函数时,绑定的 this 值会失效,this指向实例对象,但传入的参数依然生效 (new调用的优先级 > bind调用)

示例

// call 方法
function foo() {console.log(this.name)
}const obj1 = { name: 'Alice' }
const obj2 = { name: 'Bob'}foo.call(obj1)  // 输出:Alice
foo.call(obj2)  // 输出:Bob// apply方法
function bar(greeting) {console.log(greeting + ',' + this.name)
}bar.apply(obj1, ['Hello']) // 输出:Hello,Alice
bar.apply(obj2, ['Hi'])    // 输出:Hi,Bob// bind方法
const baz = foo.bind(obj1)
baz()  // 输出:Alice

总结 

特性callapplybind
用法直接调用函数并指定 this 值直接调用函数并指定 this 值创建一个新函数并指定 this 值
参数传递方式逐个传递参数以数组形式传递参数预设参数(可选)
返回值返回函数调用的结果返回函数调用的结果返回一个新函数
适用场景当你知道参数个数时当参数以数组形式存在时当你需要一个函数的特定上下文时
是否立即调用
  • 三者都可以改变函数的this对象指向

  • 三者第一个参数都是this要指向的对象,如果没有这个参数或参数为undefined或null,则默认指向全局window

  • 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入

  • bind是返回绑定之后的函数,apply和call是立即执行

本篇博客到此就结束了,希望各位大佬们点点关注点点赞,红豆泥阿里嘎多! 🌹

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LibSVM介绍及使用
  • OpenAI gym: How to get complete list of ATARI environments
  • 快人一步迅为LPDDR5版本瑞芯微RK3588核心板升级了
  • k8s环境搭建(续)
  • Typora调整图片大小的两种方式:zoom或width/height
  • docker_持久化存储
  • 2024年06月中国电子学会青少年软件编程(图形化)等级考试试卷(二级)答案 + 解析
  • 工商银行银企直联接口清单
  • Linux开发工具的使用
  • 深度解读MySQL意向锁的工作原理机制与应用场景
  • 简单比较 http https http2,我们要如何把http升级为https
  • 科研绘图系列:R语言宏基因组PCoA图(PCoA plot)
  • 常见 Mermaid 图表类型的 prompt 编写
  • Github 2024-09-13 Java开源项目日报 Top10
  • SpringBoot用kafka.listener监听接受Kafka消息
  • [nginx文档翻译系列] 控制nginx
  • Brief introduction of how to 'Call, Apply and Bind'
  • Date型的使用
  • Git初体验
  • Golang-长连接-状态推送
  • JavaScript HTML DOM
  • Javascript基础之Array数组API
  • laravel 用artisan创建自己的模板
  • Mybatis初体验
  • nodejs实现webservice问题总结
  • Redis中的lru算法实现
  • spring boot 整合mybatis 无法输出sql的问题
  • 订阅Forge Viewer所有的事件
  • 好的网址,关于.net 4.0 ,vs 2010
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 7行Python代码的人脸识别
  • UI设计初学者应该如何入门?
  • 数据库巡检项
  • 组复制官方翻译九、Group Replication Technical Details
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #QT 笔记一
  • $.ajax,axios,fetch三种ajax请求的区别
  • (02)Unity使用在线AI大模型(调用Python)
  • (4)Elastix图像配准:3D图像
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (万字长文)Spring的核心知识尽揽其中
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)平衡树
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net的DataSet直接与SQL2005交互