JavaScript系列-函数调用之apply、call、bind

news2025/1/17 5:55:52

文章目录

    • 适用场景
    • apply
      • 定义
      • 语法
      • 具体的例子
    • call
      • 定义
      • 语法
      • 例子
    • bind
      • 定义
      • 例子
      • 语法
      • 多级绑定
    • 小结
    • 更多内容

适用场景

apply、call、bind 三者都是 Function 原型上的方法,也就是说,基本所有函数都可以通过 函数名.apply|call|bind 调用

apply、call、bind 三者用于函数调用,其与普通的函数调用区别在于参数的传递和this的指向,三者常用于绑定调用方法的主体,使得this 指向重新指向新的目标。

在使用方面,三者存在一些区别,下面依次介绍apply、call和bind

apply

定义

Function 实例的apply() 方法会以指定的this值和参数(数组形式)调用该函数

语法

apply(thisArg)
apply(thisArg, argsArray)
  • 其中thisArg 就是需要重新指向的this对象,可以为null或undefined,如果函数不处于严格模式,则 null 和 undefined 会被替换为全局对象,原始值会被转换为对象。
  • argsArray 可选,一个类数组对象,用于指定调用 func 时的参数,或者如果不需要向函数提供参数,则为 null 或 undefined。

具体的例子

const numbers = [5, 6, 2, 3, 7];

const max = Math.max.apply(null, numbers);

console.log(max);
// Expected output: 7

const min = Math.min.apply(null, numbers);

console.log(min);
// Expected output: 2

call

定义

call() 方法会以给定的 this 值和逐个提供的参数调用该函数。

语法

call(thisArg)
call(thisArg, arg1)
call(thisArg, arg1, arg2)
call(thisArg, arg1, arg2, /* …, */ argN)

其中

  • thisArg,在调用 func 时要使用的 this 值。如果函数不在严格模式下,null 和 undefined将被替换为全局对象,并且原始值将被转换为对象。
  • arg1, …, argN 可选 函数的参数,个数可以为零,表示没有形参。

例子

使用 call() 调用函数并指定 this 值

function greet() {
  console.log(this.animal, "的睡眠时间一般在", this.sleepDuration, "之间");
}

const obj = {
  animal: "猫",
  sleepDuration: "12 到 16 小时",
};

greet.call(obj); // 猫 的睡眠时间一般在 12 到 16 小时 之间

bind

定义

bind 和上面的apply 、call 有所区别,bind 方法将创建一个新函数,当调用该新函数时,他会调用原始函数并将this关键字设置为指定的新的this对象,同时还可以传入一系列指定的参数,这些参数会插入到调用新函数时传入的参数前面

例子

const module = {
  x: 42,
  getX: function () {
    return this.x;
  },
};

const unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// Expected output: undefined

const boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// Expected output: 42

语法

bind(thisArg)
bind(thisArg, arg1)
bind(thisArg, arg1, arg2)
bind(thisArg, arg1, arg2, /* …, */ argN)

多级绑定

bind() 函数可以进行多级绑定,如const boundFn = fn.bind(thisArg, arg1, arg2),
绑定函数可以通过调用 boundFn.bind(thisArg, /* more args */) 进一步进行绑定,从而创建另一个绑定函数 boundFn2,但需要注意的是,新绑定的 thisArg 值会被忽略,因为boundFn2目标是boundFn, boundFn的目标是fn。最终fn 接受的参数顺序是 boundFn 的绑定参数,boundFn2 绑定参数已经boundFn2 接受的参数
如下面的例子


function log(...args) {
  console.log(this, ...args);
}
const boundLog = log.bind("this value", 1, 2);
const boundLog2 = boundLog.bind("new this value", 3, 4);
boundLog2(5, 6); // "this value", 1, 2, 3, 4, 5, 6

boundLog.bind 会忽略 new this value ,从而形成上述的代码输出顺序,进而证明同时还可以传入一系列指定的参数,这些参数会插入到调用新函数时传入的参数前面这句话

整理参数的顺序如下

  1. boundLog2执行后,先调用 boundLog ,boundLog 绑定的参数3, 4,插入到5,6前面,
  2. 而 boundLog 指向log,log.bind的绑定参数,“this value”, 1, 2,插入到 3, 4前面
  3. 最后形成 “this value”, 1, 2, 3, 4, 5, 6 顺序

小结

  1. apply和call 在效果上,基本是同等的,只是传入参数的方式不同,apply传入数组,call 可以连续传入单个参数

  2. bind 和 call|apply 效果也是 同等的,你可以将 const boundFn = fn.bind(thisArg, arg1, arg2) 和 const boundFn = (…restArgs) => fn.call(thisArg, arg1, arg2, …restArgs) 构建的绑定函数的调用效果视为等效(但就构建 boundFn 的过程而言,不是二者等效的)

  3. bind 在内部中,会返回一个新的函数,与apply 和call直接调用目标函数不同

  4. bind 多级绑定,bind 的绑定参数会插入到调用新函数传入参数前面

更多内容

关注下方微信二维码,了解更多
在这里插入图片描述

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

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

相关文章

centos7服务器安装 mysql

centos7服务器安装 mysql 一、下载 官网:https://dev.mysql.com/downloads/mysql/ 二、安装 1.查看有没有需要卸载的SQL包,一般系统的mariadb是自带的,需要卸载 rpm -qa | grep mysql rpm -qa | grep mariadb例如:安装过MySQL…

内存函数的学习

额外知识点 第一个 假设c为int类型,(char)c之后,之后如果还用变量c的话,c依然为int类型。()强制转换操作符并不会永久改变原本的变量类型。 第二个 \0在打印时不会显示出来 第三个 void …

零成本搭建一款博客网站(基于Vercel+Hexo完美实现)【保姆级教程】

文章目录 🐸基于VercelHexo零成本搭建博客网站🐻实现思路 🐮Hexo的配置与安装🐒Hexo的美化与使用🐫Github的推送与部署🐼Vercel部署与网站上线🐛总结 🐸基于VercelHexo零成本搭建博客…

Vue 实现响应式布局

实现响应式布局是工作中必不可少 客户需要 若是使用vue element ui 的方式实现 浏览器宽度为760的情况 浏览器宽度为360的情况 手机上的显示的情况 一、对于屏幕尺寸的定义 element UI参照Bootstrap的解决方案提供了五种屏幕大小尺寸:xs、sm、md、lg 和 xl。并对…

帮助谷歌从40人裂变为60000人的OKR是啥?

OKR(Objectives and Key Results)是一种目标管理方法,旨在帮助组织和个人明确目标并衡量成功。在谷歌的发展过程中,OKR扮演了至关重要的角色,帮助公司从40人规模快速成长为60000人的科技巨头。 OKR适用于各种类型的企…

Spring中你应该要知道的initMethod

文章目录 功能源码 功能 之前的文章中由解析过PostConstruct/PreDestroy,他们也是initMethod的一种形式,注解方式是后来才加入的,在源码中他们的命名都是一样的名字,都叫initMethod,不过他们却是有着很大的差别&#…

MySQL数据库基础和基本的增删改查操作

目录 前瞻 数据库的基本概念 数据库管理系统(DBMS) 数据库系统(DBS) 数据库类型和常用数据库 关系型数据库 SQL 非关系型数据库 NoSQL SQL语句 简介 SQL语句分类 常用的数据类型 MySQL的六大约束特性 SQL语句的使用 创建及删除数据库和表 …

quic协议及核心源码分析

quic协议 1、网络通信时,为了确保数据不丢包,早在几十年前就发明了tcp协议!然而此一时非彼一时,随着技术进步和业务需求增多,tcp也暴露了部分比较明显的缺陷,比如: 建立连接的3次握手延迟大; T…

亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖”

近日,业界知名IT垂直门户媒体IT168公布“2023技术卓越奖”获奖名单,亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖”。 图1:亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖” “技术卓越奖”评选是IT168重要的年度奖项评选&#xff0c…

【Filament】纹理贴图

1 前言 本文主要介绍使用 Filament 实现纹理贴图,读者如果对 Filament 不太熟悉,请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形绘制立方体 Filament 纹理坐标的 x、y 轴正方向分别朝右和朝上,其 y 轴正方向朝向与 OpenGL ES…

使用StableDiffusion进行图片Inpainting原理

论文链接:RePaint: Inpainting using Denoising Diffusion Probabilistic Models代码链接:RePaint Inpainting任务是指在任意一个二进制的掩码指定的图片区域上重新生成新的内容,且新生成的内容需要和周围内容保持协调。当前SOTA模型用单一类…

天文与计算机:技术的星辰大海

天文与计算机:技术的星辰大海 一、引言 在人类的历史长河中,天文学与计算机技术这两个领域似乎相隔甚远,然而在科技的推动下,它们却逐渐走到了一起,为人类对宇宙的探索开辟了新的道路。天文观测的复杂度与数据量随着…

C++初阶——类和对象

呀哈喽,我是结衣 C入门之后,我们就进入了C的初阶的学习了,在了解类和对象之前,我们还是先了解,面向过程和面向对象的初步认识。 在本篇博客中,我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…

攻防世界——game 游戏

下载下来是一个exe文件,可以用IDA打开 我们先运行一下 这是属于第二种类型,完成一个操作后给你flag 这种题我更倾向于动调直接得到flag 我们查壳 没有保护壳,直接32打开 进入字符串界面,找到显示的那部分 int __cdecl main_0(…

传感器原理及工程应用(2)---传感器

文章目录 1. 传感器概述1.1 传感器的组成1.2 传感器的分类 2. 传感器的静态特性2.1 灵敏度2.2 线性度2.3 迟滞2.4 重复性2.5 漂移 1. 传感器概述 1.1 传感器的组成 1. 传感器能感受(或响应)规定的被测量并按照一定的规律转换成可用输出信号的器件或装置…

B041-SSM集成_拦截器

目录 SSM整合简介整合步骤先准备spring环境核心配置文件 Spring整合Mybatis准备数据库和表Spring管理数据库连接属性文件Spring管理连接池实体类、mapper接口和映射文件Spring管理SqlSessionFactorySpring管理Mapper接口Spring管理Servive层 Spring整合SpringMVC准备web.xml准备…

PromptNER: Prompt Locating and Typing for Named Entity Recognition

原文链接: https://aclanthology.org/2023.acl-long.698.pdf ACL 2023 介绍 问题 目前将prompt方法应用在ner中主要有两种方法:对枚举的span类型进行预测,或者通过构建特殊的prompt来对实体进行定位。但作者认为这些方法存在以下问题&#xf…

最小二乘法简介

最小二乘法简介 1、背景描述2、最小二乘法2.1、最小二乘准则2.2、最小二乘法 3、最小二乘法与线性回归3.1、最小二乘法与线性回归3.2、最小二乘法与最大似然估计 4、正态分布(高斯分布) 1、背景描述 在工程应用中,我们通常会用一组观测数据去…

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体: ②使用matplotlib画图,中文字体显示不出来 【问题思考】 在网上搜了好多,关于使用python进行matplotlib画图字体显示不出来的,但是我试用了下,对我来说都没有。有些仅使用于windows系…