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

embedded/2024/10/18 20:25:21/

历史小剧场

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

概述与区别

概述

这三个函数都是为了改变函数执行时的上下文,再具体一点就是改变函数运行时的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.ppmy.cn/embedded/43678.html

相关文章

python操作rabbitmq的consumer,并强制关闭特定consumer的连接

引入 python获取指定队列的consumer python可以使用rabbitmq_management的api获取所有consumer的信息。【队列需要安装rabbitmq_management,在大部分情况下,我们安装队列的同时,都会安装管理界面,以方便一些简单的手动操作与简单…

git命令新建远程仓库

今天记录一下使用git命令新建远程分支的操作,因为公司的代码管理仓库界面没找到新建分支的操作界面,无奈只能通过git命令来新建分支。 1、新建本地分支 首先,你的至少应该已经有了一个master分支,然后你再master分支下面执行下面…

移除链表元素-力扣

题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&…

贪心算法[1]

首先用最最最经典的部分背包问题来引入贪心的思想。 由题意可知我们需要挑选出价值最大的物品放入背包&#xff0c;价值即单位价值。 我们需要计算出每一堆金币中单位价值。金币的属性涉及两个特征&#xff0c;重量和价值。 所以我们使用结构体。 上代码。 #include <i…

905. 按奇偶排序数组 - 力扣

1. 题目 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 2. 示例 3. 分析 开辟一个数组res用来保存操作过后的元素。第一次遍历数组只插入偶数&#xff0c;第二次遍历数组…

flutter性能优化-UI重绘

在Flutter中&#xff0c;可以采取以下几种方法来减少UI的重绘&#xff1a; 使用setState()方法进行批量更新&#xff1a;当需要更新多个UI元素时&#xff0c;可以使用setState()方法进行批量更新&#xff0c;而不是在每次更新时都调用setState()。这样可以减少重绘的次数&#…

有哪些藏文翻译器在线翻译?工具分享

有哪些藏文翻译器在线翻译&#xff1f;随着全球化的推进&#xff0c;语言之间的交流变得越来越重要。藏语作为中华民族的重要语言之一&#xff0c;其翻译需求也日益增加。为了满足这一需求&#xff0c;市场上涌现出了多款藏文翻译器在线翻译工具&#xff0c;它们以其高效、准确…

Ingress controller:Kubernetes 的瑞士军刀

原文作者&#xff1a;Brian Ehlert of F5 原文链接&#xff1a;Ingress controller&#xff1a;Kubernetes 的瑞士军刀 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 许多人认为 Ingress controller&#xff08;Ingress 控制器&…