【JavaScript】call、apply、bind的区别和应用

历史小剧场

其实在大多数时间里,除去超人、蝙蝠侠等不可抗力出来维护正义外,邪是经常胜正的。所谓好人、善人、老实人常常被整得凄惨无比,比如于谦、岳飞等,都是死后很多年才翻身平反。
只有岁月的沧桑,才能淘尽一切污浊,扫清人们眼帘上的遮盖与灰尘,看到那些殉道者无比璀璨的光芒,历千年而不灭。 -------《明朝那些事儿》

概述与区别

概述

这三个函数都是为了改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。
我们来看个例子

function Person(name) {this.name = name;}Person.prototype = {constructor: Person,showName: function () {console.log(this.name);}}const person = new Person('fangruichuan'); person.showName(); // fangruichuan

接下来,我们增加一个对象字面量,它没有所谓的showName()方法,不过,我们可以使用call、apply、bind帮我们干这件事

const animal = {name: 'dog'
}
// call
person.showName.call(animal); // dog// apply
person.showName.apply(animal); // dog// bind
person.showName.bind(animal)(); // dog

如此,我们拿别人的showName()方法,并动态改变其上下文帮自己输出了信息

区别
  • call、apply和bind的差别
    • call和apply改变了函数的this上下文后便可以执行该函数;
    • 但是bind是返回了改变了上下文后的一个函数
  • call、apply的区别
    • call从第二个参数开始以参数列表的形式展现;
    • apply则是把除了改变上下文对象的参数放在一个数组里面作为它的第二个参数
fn.call(obj, arg1, arg2, arg3...);
fn.apply(obj, [arg1, arg2, arg3...]);

应用

console.log("求数组中的最大和最小值-------------------------")
const arr = [34,5,3,6,54,6,-67,5,7,6,-8,687];
console.log(Math.max.call(Math, ...arr)); // 687
console.log(Math.min.call(Math, ...arr)); // -8
console.log(Math.max.apply(Math, arr)); // 687
console.log(Math.min.apply(Math, arr)); // -8console.log("将伪数组转换为数组------------------------")
const arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3};
const arr2 = Array.prototype.slice.call(arrayLike);
console.log(arr2); // ['a', 'b', 'c']console.log("数组追加--------------------")
const arr3 = [1, 2, 3]
const arr4 = [4, 5, 6]
Array.prototype.push.apply(arr3, arr4);
console.log(arr3); // [1, 2, 3, 4, 5, 6]console.log("判断变量类型-------------------------")
console.log(Object.prototype.toString.call(123)); // [object Number]
console.log(Object.prototype.toString.call('abc')); // [object String]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(function () {})); // [object Function]
console.log(Object.prototype.toString.call(new Date())); // [object Date]
console.log(Object.prototype.toString.call(/test/)); // [object RegExp]
console.log(Object.prototype.toString.call(Math)); // [object Math]

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

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

相关文章

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

C#中的事件聚合器实现方法

概述:_对象之间的关系_是使代码库难以理解和难以维护的原因。为了更好地理解它,我们求助于马丁福勒(Martin Fowler):事件聚合器是间接的简单元素。在最简单的形式中,您可以让它注册到您感兴趣的所有源对象&…

MapStruct与BeanUtils处理对象属性复制场景对比

MapStruct是什么? MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach. The generated mapping code uses plain method invocations and thus is…

elastich运维

Elastichsearch是一种高度可扩展的开源全文搜索和分析引擎,可以用来实现快速、高效的数据检索。 集群规划与部署:首先需要根据业务需求规划Elastichsearch集群的节点数量和角色(如主节点、副本节点、协调节点等)。在部署时&#x…

赎金信-力扣

这道题想到的解法是使用一个哈希表来存储magazine里每个字符出现的次数,然后遍历ransomNote,出现对应的字母则哈希表中对应的值减一,当查找不到某个字符,或者某个字符的值小于0时,则返回false。代码如下: …

ORACLE中递归遍历

--查询全部资源信息 select * from urm_class_info --向上遍历树,找到路径直到根节点,指定的是parentid select distinct classid, parentid, namefrom urm_class_infostart with parentid cmdb0000000000000017 connect by prior parentid classid …

配置Spring Security的身份验证

配置Spring Security的身份验证 在我们登录Spring Security之前,我们将向您展示如何配置Spring Security的身份验证。我们将通过创建一些用户来验证并为它们生成身份验证。在这篇文章中,我们将学习Spring Security的流程是配置Spring Security中的身份验…

代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 文档讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E…

VMware Workstation 不可恢复错误:(vmui) 错误代码0xc0000094

软件版本 vmware 17 错误情况 VMware Workstation 不可恢复错误:(vmui) Exception 0xc0000094 has occurred. 问题原因 VMware升级到17.0后,将虚拟机环境的【硬件兼容性】升级至Workstation 17.X后,无法修改设备参数。 解决办法 打开需…

企业营收分析难?搞定收入认领月底不加班!

在当今日益激烈的市场竞争中,企业的营收分析不仅是衡量经营成果的关键指标,更是指导企业未来发展的重要依据。然而,对于许多企业来说,营收分析的过程往往繁琐且耗时,尤其是月底结账时,大量的数据和复杂的计…

【Numpy】NumPy基础入门:创建和管理多维数组

NumPy基础入门:创建和管理多维数组 简介 NumPy(Numerical Python的简称)是Python语言的一个基础科学计算库,广泛应用于数据分析、机器学习、科学计算和工程领域。NumPy的核心是其强大的N维数组对象ndarray,它为Pytho…

医疗图像处理2023:Transformers in medical imaging: A survey

医学成像中的transformer:综述 目录 一、介绍 贡献与安排 二、CNN和Transformer 1.CNN 2.ViT 三、Transformer应用于各个领域 1.图像分割 1)器官特异性 ①2D ②3D 2)多器官类别 ①纯transformer ②混合架构 单尺度 多尺度 3)…

fyne表单布局

fyne表单布局 layout.FormLayout就像一个 2 列网格布局 。 package mainimport ("image/color""fyne.io/fyne/v2/app""fyne.io/fyne/v2/canvas""fyne.io/fyne/v2/container""fyne.io/fyne/v2/layout" )func main() {myApp…

electron 如何升级版本

electron-updater使用指南 基础 检测是否最新版 autoUpdater.checkForUpdates() 下载最新版 autoUpdater.downloadUpdate() 项目使用 update.js const { ipcMain } require(electron) const { autoUpdater } require(electron-updater) const path require("pa…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总:待办事项的总数已完成:待办事项里面有多少条完成的待办完成比例:已完成和汇总之间的比例备忘录:显示备忘录的总数待办事项:显示待办事项未完成的集合备忘录&…

②单细胞学习-组间及样本细胞比例分析

目录 数据读入 每个样本各细胞比例 两个组间细胞比例 亚组间细胞比例差异分析(循环) 单个细胞类型亚新间比例差异 ①单细胞学习-数据读取、降维和分群-CSDN博客 比较各个样本间的各类细胞比例或者亚组之间的细胞比例差异 ①数据读入 #各样本细胞…

三、Ollama导入大模型(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

Ollama导入大模型 一、导入Ollama大模型1、使用run命令2、使用Modelfile方式 二、导入自定义大模型(Ollama官网以外的大模型)三、使用OpenWebUI导入大模型 Ollama可以导入官方提供的大模型,也可以导入huggingface上的自定义大模型&#xff08…

【加密与解密(第四版)】第十四章笔记

第十四章 漏洞分析技术 14.1 软件漏洞原理 缓冲区溢出漏洞:栈溢出 堆溢出、整型溢出(存储溢出、计算溢出、符号问题) UAF(Use-After-Free)漏洞 14.2 ShellCode 功能模块:下载执行、捆绑、反弹shell 14.3 …

【NumPy】使用NumPy计算相关系数:详解numpy.corrcoef函数及应用

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

MySQL之性能剖析(二)

MySQL之性能剖析 通过性能剖析进行优化 一旦掌握并时间面向响应时间的优化方法,就会发现需要不断地对系统进行性能剖析(profiling). 性能剖析是测量和分析时间花费在哪里的主要方法。性能剖析一般有两个步骤:测量任务所花费的时间;然后对结果进行统计和…