【js】js中apply()、bind()、call()用法

news2025/1/17 18:07:31

这三个方法的作用基本上相同,用法上有一些不同,下面先对比一下它们的用法:

  • apply:调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。
    语法:
apply(thisArg)
apply(thisArg, argsArray) 
  • bind:创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
    语法:
function.bind(thisArg[, arg1[, arg2[, ...]]])
  • call:使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
    语法:
function.call(thisArg, arg1, arg2, ...)

举个例子说明一下:
三个方法解决同样的问题:
JavaScript 新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,期望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。

代码:
apply:

<script>

    this.x = 9; // 在浏览器中,this 指向全局的 "window" 对象
    var module = {
        x: 81,
        getX: function (y) {
            return this.x+':'+y;
        },
    };

    var module02 = {
        x: 91
    };

   console.log(module.getX(1));

    var retrieveX = module.getX;

    console.log(retrieveX(1));
    // 返回 9:1 - 因为函数是在全局作用域中调用的

    // 把 'this' 绑定到 module 对象
    var boundGetX = retrieveX.apply(module,[1]);
    console.log(boundGetX); // 81:1

    // 把 'this' 绑定到 module02对象,module02继承了getX
    var boundGetX2 = retrieveX.apply(module02,[1]);
    console.log(boundGetX2); // 81:1
</script>

输出结果:
在这里插入图片描述

bind:

<script>

    this.x = 9; // 在浏览器中,this 指向全局的 "window" 对象
    var module = {
        x: 81,
        getX: function () {
            return this.x;
        },
    };

   console.log(module.getX());// 81

    var retrieveX = module.getX;
    console.log(retrieveX());
    // 返回 9 - 因为函数是在全局作用域中调用的

    // 创建一个新函数,把 'this' 绑定到 module 对象
    // 新手可能会将全局变量 x 与 module 的属性 x 混淆
    var boundGetX = retrieveX.bind(module);
    console.log(boundGetX()); // 81
</script>

输出结果:
在这里插入图片描述

call:

<script>

    this.x = 9; // 在浏览器中,this 指向全局的 "window" 对象
    var module = {
        x: 81,
        getX: function (y) {
            return this.x+':'+y;
        },
    };

    var module02 = {
        x: 91
    };

   console.log(module.getX(1));

    var retrieveX = module.getX;

    console.log(retrieveX(1));
    // 返回 9:1 - 因为函数是在全局作用域中调用的

    // 把 'this' 绑定到 module 对象
    var boundGetX = retrieveX.call(module,1);
    console.log(boundGetX); // 81:1

    // 把 'this' 绑定到 module02对象
    var boundGetX2 = retrieveX.call(module02,1);
    console.log(boundGetX2); // 81:1
</script>

输出结果:
在这里插入图片描述
从上面的例子可以看出,apply与call基本相同,区别是apply的第二个参数是传数组,而call是传一个或多个参数。bind的区别是调用时要加(),它返回的是一个函数。三者的作用都是为方法指定this的值。

用例:
1、apply用数组获取最大最小值

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

ES6 的写法:...扩展运算符

Math.max(...[14, 3, 77])

2、将一个数组放到另外一个数组后面

// ES5 的写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6 的写法
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

3、使用 call 方法调用匿名函数
在下例中的 for 循环体内,创建了一个匿名函数,然后通过调用该函数的 call 方法,将每个数组元素作为指定的 this 值执行了那个匿名函数。这个匿名函数的主要目的是给每个数组元素对象添加一个 print 方法,这个 print 方法可以打印出各元素在数组中的正确索引号。当然,这里不是必须得让数组元素作为 this 值传入那个匿名函数(普通参数就可以),目的是为了演示 call 的用法。

var animals = [
  { species: "Lion", name: "King" },
  { species: "Whale", name: "Fail" },
];

for (var i = 0; i < animals.length; i++) {
  (function (i) {
    this.print = function () {
      console.log("#" + i + " " + this.species + ": " + this.name);
    };
    this.print();
  }).call(animals[i], i);
}

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

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

相关文章

allure相关笔记

allure.epic&#xff1a;最高级别的分类&#xff0c;表示一个大的功能、模块或业务场景。功能模块 allure.feature&#xff1a;表示一个功能模块或业务子场景&#xff0c;位于史诗下。主流程 allure.story&#xff1a;表示一个具体的测试场景&#xff0c;位于特性下。具体主流程…

分享几个自己常用的JS库加快开发效率

分享经常用的几个js库&#xff0c;主要涉及到前端的视频播放&#xff08;直播&#xff09;、时间格式化、时间范围选择、连续翻滚、防抖等js库。可以很好的解决前端的一些问题。 1.videojs 是一个通用的在网页上嵌入视频播放器的 JS 库&#xff0c;Video.js 自动检测浏览器对 …

零代码新思路,基于LogicFlow的页面逻辑编排

在滴滴客服业务里&#xff0c;通过零代码的方式来配置页面已有丰富的落地经验&#xff0c;大大提高了服务用户的效率和质量。但是传统零代码在页面逻辑配置上表现并不好&#xff0c;很难做到灵活扩展。因此&#xff0c;滴滴客服技术团队探索出一种新思路&#xff0c;用流程编排…

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途&#xff1a; ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等&#xff1b;室内使用效果均佳。 产品特点&#xff…

多传感器外参标定

文章目录 lidar和imu标定code: [https://gitcode.net/weixin_42990464/calib_lidar_imu](https://gitcode.net/weixin_42990464/calib_lidar_imu)code: [https://github.com/APRIL-ZJU/lidar_IMU_calib](https://github.com/APRIL-ZJU/lidar_IMU_calib) lidar和imu标定 code: …

WORD如何调整表格的宽度

目录 1. 调整表格宽度 1. 调整表格宽度 如下图&#xff0c;要求将文档中的表格宽度调整到2厘米。 点击选中要调整的表格&#xff0c;依次点击【布局】-【属性】选项。 如下图&#xff0c;通过上一个步骤的操作&#xff0c;系统弹出表格属性对话框。 在弹出的【表格属性】对话框…

尚硅谷MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种&#xff0c;大致了解下即可 DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;定义了…

DRF的限流组件(源码分析)

限流&#xff0c;限制用户访问频率&#xff0c;例如&#xff1a;用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次&#xff0c; 防止盗刷。 对于匿名用户&#xff0c;使用用户IP作为唯一标识。对于登录用户&#xff0c;使用用户ID或名称作为唯一标识。 缓存{用户…

图文结合丨带你轻松玩转MySQL Shell for GreatSQL

一、引言 1.1 什么是MySQL Shell ? MySQL Shell 是 MySQL 的一个高级客户端和代码编辑器&#xff0c;是第二代 MySQL 客户端。第一代 MySQL 客户端即我们常用的 MySQL 。除了提供类似于 MySQL 的 SQL 功能外&#xff0c;MySQL Shell 还提供 JavaScript 和 Python 脚本功能&a…

免费开源服务器资源监控系统grafana+prometheus+node_exporter

有项目做测试的时候需要查询服务器资源利用情况&#xff0c;自己又没写相应的模块&#xff0c;此时就需要一套好用的资源监控系统&#xff0c;&#xff0c;咨询了运维人员给推荐了一套&#xff0c;装完后真的很好用。 就是grafanaprometheusnode_exporter&#xff08;linux&am…

Python项目实战:将3D灰度图像转换为3D彩色图像

文章目录 (3D-GRAY) to (3D-RGB)&#xff1a;使用颜色映射的方式&#xff0c;将灰度值映射到彩色空间中的特定颜色。一、多维数组&#xff1a;10x12x14&#xff08;1&#xff09;channel重复&#xff1a;在RGB中&#xff0c;将【灰度图】分别赋值给【R/G/B图】&#xff0c;显示…

NPM与外部服务的集成(下)

目录 1、撤消访问令牌 2、在CI/CD工作流中使用私有包 2.1 创建新的访问令牌 持续整合 持续部署 交互式工作流 CIDR白名单 2.2 将令牌设置为CI/CD服务器上的环境变量 2.3 创建并签入特定于项目的.npmrc文件 2.4 令牌安全 3、Docker和私有模块 3.1 背景&#xff1a;运…

类加载器与反射

类加载器&#xff0c;反射 1.类加载器 1.1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0…

如何做好项目进度管理,项目经理可以这样做

项目追踪是通过把控项目的进度、成员的任务完成情况&#xff0c;以及项目计划进展等方面来进行的。项目经理在进行项目进度跟踪时&#xff0c;主要从以下三个方面进行&#xff1a; 1、制定并完善项目计划 项目经理使用进度猫等工具制定项目计划&#xff0c;通过甘特图对项目…

将Excel表格复制到Word文档中

目录 方式1&#xff1a;粘贴 -> 保留源格式&#xff08;CtrlV的默认行为&#xff09;参考文献 方式1&#xff1a;粘贴 -> 保留源格式&#xff08;CtrlV的默认行为&#xff09; 保留源格式是Word在粘贴来自其他程序内容时的默认行为&#xff08;直接CtrlV&#xff09;。如…

解决右键打印html只能识别1页的问题

hello,大家好久不见,昨天在开发中遇到了一个问题,就是在自己开发的网页中右键-->打印&#xff0c;由于页面内容过多&#xff0c;打印出来的内容只被识别到一页。 针对这一问题&#xff0c;查阅了好多资料最终解决啦。 1.问题重现 大家可以看到这个是我们开发的页面,公司需要…

.netcore grpc的proto文件字段详解

一、.proto文件字段概述 grpc的接口传输参数都是根据.proto文件约定的字段格式进行传输的grpc提供了多种类型字段&#xff1b;主要包括标量值类型&#xff08;基础类型&#xff09;、日期时间、可为null类型、字节、列表、字典、Any类型&#xff08;任意类型&#xff09;、One…

Python文件操作与输入输出:从基础到高级应用

文章目录 &#x1f340;引言&#x1f340;文件操作基础&#x1f340;上下文管理器与文件自动关闭&#x1f340;文件的迭代与逐行读取&#x1f340;文件的其他常见操作&#x1f340;输入输出基础&#x1f340; 文件输入输出&#x1f340;格式化输出&#x1f340;高级文件操作&am…

6---列表

一、有序列表 在文本前面添加数字英文句点&#xff08;.&#xff09;空格可以构成有序列表。如下表&#xff0c;最终生成的列表前面的编号和前面的数字没有绝对关系&#xff0c;总是从第一个数字开始依次增加。&#xff08;和C的枚举有一点点类似&#xff09; 注意&#xff1a;…

解决keep-alive缓存失效问题【必看!!!】

最近正在使用Vue3TsPinia重构后台管理项目&#xff0c;在写到路由缓存时&#xff0c;发现怎么都缓存不了&#xff0c;后来才找到了原因&#xff1a; Vue3中的setup语法糖中的name命名无效 即&#xff1a;如果你是按如下写组件的name&#xff0c;是不起作用的 <script nam…