深入理解JavaScript - JavaScript中call、apply、bind方法

news2024/12/23 17:19:06

一、call() / apply()

JavaScript中的函数是对象,与其他JavaScript对象一样,JavaScript函数也有方法。其中有两个自带的方法 – call和apply,可以利用这两个方法来间接调用某个函数。

通过一个简单的例子体会一下call和apply的用法:

function f(){
	console.log(this.name)
}
let obj = {name:"obj"}
f.call(obj) // => obj :调用函数f,并指定this值为obj对象
f.apply(obj) // => obj :调用函数f,并指定this值为obj对象

上面的代码类似于下面的程序:

let obj = {name:"obj"}
obj.f =  f;// 在对象上定义一个属性指向f函数对象
obj.f();
delete obj.f;

从第一段程序看,call和apply没什么区别。事实上两个方法的区别确实很小,只在传递参数形式上有去区别。

两个方法,只有参数形式的区别

apply的参数要求是数组或类数组对象
下面是一段给apply、call方法传递多个参数的程序,看看它们之间的区别:

function f(p1, p2) {
    console.log(this.name, p1, p2)
}
// f.apply(obj,1,2) // => 报错:Uncaught TypeError: ...called on non-object
f.apply(obj, [1, 2]);//obj 1 2 : 传递给函数的参数需要采用数组或类数组的形式
let arrlike = { 0: "1", 1: "2", length: 2 };
f.apply(obj, arrlike);// => obj 1 2 : 传递给函数的参数需要采用数组或类数组的形式

let obj = { name: "obj" }
f.call(obj, 1, 2) // => obj 1 2 :调用函数f,并指定this值为obj对象,传递两个实参给f函数

⚠️ apply传递参数需要采用数组或类数组的形式,否则报错

apply使用场景

ES6前替代扩展操作符 – 将参数数组转换为参数列表

let max = Math.max(2,3,5,7,0);
console.log(max);// 7

max = Math.max([2,3,5,7,0]);
console.log(max);// NaN

max = Math.max(...[2,3,5,7,0]);
console.log(max);// 7

max = Math.max.apply(Math,[2,3,5,7,0]);
console.log(max);// 7

箭头函数问题

⚠️ 箭头函数调用call/apply方法,第一个参数会被忽略(因为箭头函数的this值在定义时绑定)。

var name = "window"
let arrow_fun = (v) => {
   console.log(this.name,v);// window 1
}
let normal_fun = function(v){
   console.log(this.name,v);// window 1
}
var obj = {
   name: "obj"
}
arrow_fun.call(obj, 1, 3); // window 1:箭头函数中第一个参数(obj)被忽略,实参3无参数接收被忽略
normal_fun.call(obj, 1, 3);// obj 1:实参3没有参数接收被忽略

二、bind方法

( bind()方法的主要目的是把函数绑定到对象 . 这句话会让人误以为给对象添加了一个新方法)

其实,bind方法是利用现有函数,创建并返回一个新的函数,同时为其绑定了一个对象为this。
(apply和call是绑定this并直接调用)

function f(y) {
    return (this.x + y);
}
let o1 = { x: 1 };
let fbo1 = f.bind(o1);//bind方法是利用现有f函数,创建并返回一个新的函数,同时绑定了o1为新函数的this
// o1.f(); // 报错: Uncaught TypeError: o.f is not a function
console.log(fbo1(2)); // => 3

let o2 = { x: 90, fbo1 };
console.log(o2.fbo1(10)); // => 11: fbo函数仍然与o绑定.

⚠️ o1.f() 报错 ,bind并没有给对象添加了一个新方法!

柯里化

bind方法不但可以绑定对象为新函数的this,还能为函数绑定参数

function f(y) {
    return (this.x + y);
}
let o1 = { x: 1 };
let fbo1 = f.bind(o1,9);//bind方法是利用现有f函数,创建并返回一个新的函数
//同时绑定了o1为新函数的this;
//还绑定的新函数的第一个参数的值一直为9
console.log(fbo1(2)); // => 10 函数的参数已经绑定了9,再传参就无效了

返回的新函数上绑定o1为this值,同时绑定了一个参数值9,见下图
在这里插入图片描述
从图中可以看出,绑定的参数是以数组的形式绑定的。

三、总结

// call/apply绑定对象为this,并直接执行
函数.call(绑定的对象,参数1...参数n);
函数.apply(绑定的对象,[参数1...参数n]); 

// 仅绑定对象为this并返回新函数,并不执行
函数.bind(绑定的对象);

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

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

相关文章

windows下使用的的数字取证工作工具套装:forensictools

推荐一套windows下使用的的数字取证工作工具套装:forensictools 部分工具包括: ▫️exiftool,一个命令行应用程序和 Perl 库,用于读写元信息。 ▫️YARA,一款开源工具,用于对恶意软件样本进行识别和分类。…

LeetCode最长有效括号问题解

给定一个仅包含字符的字符串(’ 和 ‘)’,返回最长有效的长度(出色地-形成) 括号子弦。 示例1: 输入:s “(()” 输出:2 说明:最长的有效括号子字符串是 “()” 。 示例2: 输入:s “)()())…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

记一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

【C++程序员的自我修炼】拷贝构造函数

心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结&#xff1a; 深拷贝 拷贝构造函数典型调用场景 总结 契子✨ 在生活中总有很多琐事&#xff0c;不做不行做了又怕麻烦&#xff0c;有时候想要是有个和自己一模一样的人就…

功能测试_订购单检查_判定表

画判定表的步骤&#xff1a; 列出条件 列出动作

[大模型]Yi-6B-chat WebDemo 部署

Yi-6B-chat WebDemo 部署 Yi 介绍 由60亿个参数组成的高级语言模型 Yi LLM。为了促进研究&#xff0c;Yi 已经为研究社区开放了Yi LLM 6B/34B Base 和 Yi LLM 6B/34B Chat。 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–…

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

Springboot+Vue项目-基于Java+MySQL的旅游网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

OpenCV轻松入门(六)——简单图片处理【马赛克、毛玻璃、浮雕效果】

马赛克效果 马赛克指现行广为使用的一种图像&#xff08;视频&#xff09;处理手段&#xff0c;此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果&#xff0c;因为这种模糊看上去有一个个的小格子组成&#xff0c;便形象的称这种画面为马赛克。其目的通常是使之无法辨…

麒麟v10安装mysql-8.0.35

因为要修复漏洞的原因&#xff0c;这两天将麒麟v10操作系统的服务器上的MySQL版本由5.7.27升级到8.0.35&#xff08;mysql安装包下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions)&#xff09;&#xff0c;mysql的安装过程主要参考了这个博主…

Qlik在数据隐私计划中利用人工智能和分析

在技术快速变革的时代&#xff0c;政府正在努力追赶技术发展和我们日常生活中产生的个人身份信息&#xff08;“PII”&#xff09;数量不断增加的步伐。规范 PII 使用的隐私法不断加强&#xff08;Gartner估计&#xff0c;虽然到 2020 年&#xff0c;全面的隐私法将覆盖全球 10…

MQ:延迟队列

6.1场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 *…

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司&#xff08;State Grid Corporation of China&#xff0c;简称SGCC&#xff09;是中国最大的国有企业之一&#xff0c…

【漏洞预警】Linux kernel权限提升漏洞(CVE-2024-1086)

一、漏洞概述 漏洞名称 Linux kernel权限提升漏洞 CVE ID CVE-2024-1086 漏洞类型 Use-After-Free 发现时间 2024-03-28 漏洞评分 7.8 漏洞等级 高危 攻击向量 本地 所需权限 低 利用难度 低 用户交互 无 PoC/EXP 已公开 在野利用 未知 Netfilte…

突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

学习数通HCIE选择誉天有什么优势?

誉天数通课程亮点 课程内容详实&#xff0c;千万级实训环境 涵盖数通技术全场景热门技术&#xff0c;涉及传统园区网&#xff0c;虚拟化园区网&#xff0c;广域互联技术&#xff0c;数据中心网络&#xff0c;网络自动化运维 专业机房环境&#xff0c;全真机教学演示&#xf…

Linux、Docker、Brew、Nginx常用命令

Linux、Docker、Brew、Nginx常用命令 Linuxvi编辑器文件操作文件夹操作磁盘操作 DockerBrewNginx参考 Linux vi编辑器 Vi有三种模式。命令模式、输入模式、尾行模式&#xff0c;简单的关系如下&#xff1a; i -- 切换到输入模式&#xff0c;在光标当前位置开始输入文本。&a…

Pytorch Windows EOFError: Ran out of input when num_workers>0

关于深度学习的一些学习框架,我使用过pytorch,caffe,caffe2,openchatkit,oneflow等,最近我将长达几十万字的报错手册重新进行了整理,制作出一个新的专栏,主要记录这几种常见的开发框架在安装和使用过程中常见的报错,以及我是如何解决掉的,以此来帮助更多的深度学习开…

生成式AI对UiPath来说是机遇还是挑战?

企业争相通过技术革新来领跑市场&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;技术更是将企业的效率和成本控制推向了新的高度。但当人工智能&#xff08;AI&#xff09;的最新进展——生成式AI登上舞台时&#xff0c;它不仅带来了变革的可能&#xff0c;还提出了一…