call、apply、bind三者的区别

callapplybind都是可以改变函数 this 对象指向的方法,但它们也有各自的特点。

call()

写了就等于直接调用函数。写法如下:

fun.call(obj,要传给函数的参数1,要传给函数的参数2...)

call() 接收多个参数第一个函数上下文也就是this,后边参数为函数本身的参数。 

var name = '琪琪';var obj = {name: '...琪琪',print: function (name) {console.log(this.name);console.log(name);}
}let { print } = obj;
print.call(obj, '琪琪...'); 
// ...琪琪
// 琪琪...

apply()

写了就等于直接调用函数,区别于 call 就是后面参数的传入,其他都一样

fun.apply(obj,[要传给函数的参数1,要传给函数的参数2...])

apply() 接收的是一个包含多个参数的数组 ,第一个函数上下文也就是this

var name = '拉拉';var obj = {name: '...拉拉',print: function (name) {console.log(this.name);console.log(name);}
}let { print } = obj;
print.apply(obj, ['拉拉...']); 
// ...拉拉
// 拉拉...

bind()

写了还要加括号才算调用函数,跟 call 参数设置一样

foo.bind(obj,要传给函数的参数1,要传给函数的参数2...)

bind()方法创建一个新的函数,我们必须要手动去调用。 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。 

var name = '蹦蹦';var obj = {name: '...蹦蹦',print: function (name) {console.log(this.name);console.log(name);}
}let { print } = obj;
print.bind(obj, '蹦蹦...')(); 
// ...蹦蹦
// 蹦蹦...

总结

  • 三者都可以改变函数的 this 对象指向。
  • 三者第一个参数都是 this 要指向的对象,如果如果没有这个参数或参数为 undefined 或 null,则默认指向全局 window。
  • 三者都可以传参,但是 apply 是数组,而 call 是参数列表,且 apply 和 call 是一次性传入参数,而 bind 可以分为多次传入。
  • bind 是返回绑定 this 之后的函数,便于稍后调用;apply 、call 则是立即执行 。
  • bind()会返回一个新的函数,如果这个返回的新的函数作为构造函数创建一个新的对象,那么此时 this 不再指向传入给 bind 的第一个参数,而是指向用 new 创建的实例

此文章引用了一下博主的优秀文章万分感谢

原文链接:https://blog.csdn.net/weixin_46235143/article/details/122512538
                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bittensor怎么挖?手把手教你,使用bitget钱包

4月 Binance 上新 TheBittensorHub (TAO), 这个项目究竟做了什么可以令其在上大舞台前就已经在所有通证中排名前 30? 本文将深度解析。 该项目既不直接贡献数据,也不直接贡献算力。 而是通过区块链网络和激励机制,来对不同的算法进行调度和…

【HarmonyOS】综合应用-《校园通》

概念 本文结合之前的笔记文章知识点,做一个综合性的小应用。 创建一个ArkTS语言的鸿蒙项目,搭建首页面 其界面代码如下,该界面使用了垂直布局,相对布局,轮播布局,以及图片,文本等组件的综合运…

【CTF MISC】XCTF GFSJ0510 this_is_flag Writeup(信息收集)

this_is_flag Most flags are in the form flag{xxx}, for example:flag{th1s_!s_a_d4m0_4la9} 解法 大多数标志的形式都是flag{xxx},例如:flag{th1s_!s_a_d4m0_4la9} Flag flag{th1s_!s_a_d4m0_4la9}声明 本博客上发布的所有关于网络攻防技术的文章…

具身智能论文(一)

目录 1. PoSE: Suppressing Perceptual Noise in Embodied Agents for Enhanced Semantic Navigation2. Embodied Intelligence: Bionic Robot Controller Integrating Environment Perception, Autonomous Planning, and Motion Control3. Can an Embodied Agent Find Your “…

免费的国内版 GPT 推荐,5个国产ai工具

提起AI,大家第一个想到的就是GPT。 虽然它确实很厉害,但奈何于我们水土不服,使用门槛有些高。 不过随着GPT的爆火,现在AI智能工具已经遍布到各行各业了,随着时间的推移,国内的AI工具也已经“百花盛放”了…

Pencils Protocol 提供层次化的 Staking,品牌升级不断

Pencils Protocol 是一个 Scroll 生态中的一个综合应用平台,在全新的品牌升级后(原为 Penpad),其在原有的 LaunchPad 的基础上,进一步向收益聚合器、RWA 等板块进行全新的拓展。目前,Pencils Protocol 生态的整体功能板块包括 Lau…

人脸识别技术在访客管理中的应用

访客办理体系,能够使用于政府、戎行、企业、医院、写字楼等众多场所。在办理时,需求对来访人员身份进行精确认证,才能保证来访人员的进入对被访单位不被外来风险入侵。在核实身份时,比较好的方法就是选用人脸辨认技能,…

bat xcopy 解析

echo off set source_folder"C:\path\to\source" set destination_folder"C:\path\to\destination" set exclude_file"C:\path\to\excluded_folders.txt"REM 创建目标文件夹(如果不存在) mkdir %destination_folder% 2>…

【QEMU系统分析之实例篇(三十二)】

系列文章目录 第三十二章 QEMU系统仿真的机器创建分析实例 pcie.0 文章目录 系列文章目录第三十二章 QEMU系统仿真的机器创建分析实例pcie.0 前言一、QEMU是什么?二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2. 将当前机器配置导出到文件qmp_x_exit…

JDK的串行收集器介绍与优化指南-01

JDK串行收集器概述 定义与背景 串行收集器(Serial Collector)是Java虚拟机(JVM)中的一种单线程垃圾收集器,它在垃圾收集过程中会暂停所有工作线程,直至收集完成。它适用于内存资源受限、对吞吐量要求不高…

探索Java的未来!

Java是一种成熟、稳定且广泛使用的编程语言,它在企业级应用、Android 应用开发和大数据处理等领域有着广泛的应用。虽然Java已经存在了30多年,但它依然在不断发展和进化。以下是一些可能会影响 Java 未来的因素: 新版本的发布:Jav…

【玄机平台】应急响应

前言: 感谢玄机平台靶机的提供,让我学到了不少东西 平台题解 : 第一章 应急响应-webshell查杀 1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx} ssh连接 下载/var/www/html源码(finsehll连直接下)压缩丢…

JavaWeb--15 tlias-web-management 黑马程序员 部门管理(修改部门信息)

tlias 1 需求分析和开发规范2 部门管理2.1 查询部门2.2 删除部门2.3 添加部门2.4 更新部门 1 需求分析和开发规范 需求说明–接口文档–思路分析–开发–测试–前后端联调 查看页面原型明确需求 根据页面原型和需求,进行表结构设计、编写接口文档(已提供) 阅读接口…

vue3专栏项目 -- 四、前后端结合(下)

一、async 和 await 1、使用async 和 await 改造异步请求 在接触后端API以后就遇到了越来越多的异步请求,现在我们就使用async 和 await 改造异步请求。 async function是把返回内容包裹成个Promise返回Promise await 它在async function里面才起作用&#xff0…

PHP 使用常量实现枚举类

PHP 使用常量实现枚举类 <?php abstract class Enum {private static $constCacheArray NULL;private static function getConstants() {if (self::$constCacheArray NULL) {self::$constCacheArray [];}$calledClass get_called_class();if (!array_key_exists($call…

ini配置文件怎么存取False

1、ini文件介绍 INI文件&#xff08;全称为Initialization File&#xff0c;初始化文件&#xff09;是一种简单的文本文件格式&#xff0c;用于存储配置数据。它广泛应用于操作系统和各种应用程序中&#xff0c;用来保存设置、参数或初始化信息。INI文件的基本结构包括节&…

服务器之间传输文件

服务器1传输到10.140.8.8里面&#xff0c;其中root账户 先-r参数递归压缩文件夹Dir为Dir.zip&#xff0c;然后传输Dir.zip会快一些&#xff0c;当然了&#xff0c;如果你scp递归传输也是可以用的 方法1&#xff1a;压缩后传输&#xff0c;非递归&#xff0c;推荐 zip -r Dir.z…

Office之Word应用(二)

一、页眉添加文件名称和页码 1、双击页眉&#xff0c;点击“页眉-空白&#xff08;三栏&#xff09;” 2、删掉第一处&#xff08;鼠标放在上面就会选中&#xff0c;Enter即可&#xff09;&#xff0c;第二处输入文档名称&#xff0c;第三处插入页码。 注&#xff1a;插入页码时…

Jmeter 性能-阶梯负载最终请求数

1、设置阶梯加压线程组请求参数 说明&#xff1a; 每隔2秒钟&#xff0c;会在1秒内启动5个线程 每次线程加载之后都会运行2s然后开始下一次线程加载 最终会加载50个线程并持续运行30s 50个线程持续运行30s后&#xff0c;会每隔2秒钟停止5个线程&#xff0c;剩余的线程继续负…

在Git中文件的三个阶段

2024年5月9日&#xff0c;周四上午 在 Git 中&#xff0c;文件的状态通常分为三个阶段&#xff1a;已修改&#xff08;modified&#xff09;、已暂存&#xff08;staged&#xff09;和已提交&#xff08;committed&#xff09;。 以下是对这三个状态的简要说明&#xff1a; 已…