23-apply、bind、call区别?实现一个 bind

news/2024/11/7 18:09:38/

一、作用

🍕🍔🍕改变函数运行时的this指向
举个例子

var name = "kkkjjjj";
var obj = {name = '111112222',say:function(){console.log(this.name)	}
};
obj.say();//111112222
setTimeout(obj.say,0) // kkkjjjj 指向 window 对象才能访问 全局变量

我实际需要 this 指向 obj 对象,访问作用域内的变量,需要改变 this指向了

setTimeout(obj.say.bind(obj),0)

二、区别

apply

🍕🍕🍕接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入

改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

function fn(...args){console.log(this,args)
}
let obj = {name:'ls'
}
fn.apply(obj,[4,5,6])
fn(4,5,6)

注意:第一个参数为null、undefined的时候,默认指向window(在浏览器中)

call

🍔🍔🍔第一个参数也是this的指向,后面传入的是一个参数列表,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次

同样的,当第一个参数为null、undefined的时候,默认指向window(在浏览器中)

bind

第一个参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入)

特点:改变 this 指向后不会立即执行,而是返回一个永久改变 this 指向的函数

function fn(...args){console.log(this,args)
}
let obj = {name:"ls"
}
const bindFn = fn.bind(obj);
bindFn(4,5,6)
fn()

实现

实现bind的步骤

  • 修改this 指向
  • 动态传递参数
// 方式一:只在bind 中传递函数参数
fn.bind(obj,1,2)()
// 方式二:在bind 中传递函数参数,也在返回函数中传递参数
fn.bind(obj,1)(2)
  • 兼容 new 关键字
Function.prototype.Bind = function(context){// 判断调用对象是否为函数if(typeof this !== "function"){throw new TypeError("Error");	}// 获取参数const args = [...arguments].slice(1),fn = this;return function Fn(){// 根据调用方式,传入不同绑定值return fn.apply(this instanceof Fn ? new fn(...argument) : context,args.concat(...arguments));	}
}

http://www.ppmy.cn/news/706821.html

相关文章

jdbc规范示例与DButil的编写

这里主要是回顾一下jdbc的写法,我们后面基本都用orm框架和spring全面接管了,不会使用jdbc开发,但是jdbc是基础也是重点,于是写这篇来回顾一下。 package com.mashibing;import java.sql.Connection; import java.sql.DriverManage…

BUUCTF [GXYCTF2019] CheckIn 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 密文&#xff1a; dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg解题思路&#xff1a; 1、观察密文&#xff0c;一眼Base64加密&#xff0c;使用在线工具Base64加解密&#xff0c;得到另一串密文。 v)*L*_F0<}H0>…

minipcie转nvme,msata转ngff sata

现如今的电脑主板&#xff0c;m.2/ngff接口相当普遍。具有minipcie接口的主板大概只有工控主板和老款的主板的了。并不代表minipcie就会别淘汰了。 对于消费用户&#xff0c;minipcie接口就是装个无线网卡。但在某些情况下&#xff0c;并不需要这无线网卡功能&#xff0c;这一接…

剑指 offer 36. 二叉搜索树与双向链表

描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围&#xff1a;输入二叉树的节点数 0≤n≤1000&#xff0c;二叉树中每个节点的值 0≤val≤1000&#xff0c;要求&#xff1a;空间复杂度 O(1)&#xff08;即在原树上操作&…

2023夏-杂牌ngff的sata固态使用primocache的性能提升

测试的固态是作为系统盘并且写入三分之二的杂牌sata协议固态&#xff0c;性能偏低但还可以用的程度 用了增强的软件是 PrimoCache4.2 之前的跑分是360&#xff0c;很低了但还能正常使用&#xff0c;4k的读取速度很低 安装并配置内存500m的读写缓存后 聊胜于无吧&#xff0c;多多…

ModaHub魔搭社区:Milvus 数据迁移工具 – MilvusDM

目录 Milvus 数据迁移工具 — MilvusDM 简介 功能介绍 Faiss to Milvus Milvus 数据迁移工具 — MilvusDM 简介 MilvusDM 是一款针对 Milvus 研发的数据迁移工具&#xff0c;支持 Milvus 数据传输以及数据文件的导入与导出&#xff1a; Faiss to Milvus&#xff1a;将未…

MySQL意向锁(Intent Lock)

当我们想要获取某个数据表的排它锁的时候&#xff0c;需要先看下这张数据表有没有上了排它锁。如果这个数据表中的某个数据行被上了行锁&#xff0c;我们就无法获取排它锁。这时需要对数据表中的行逐一排查&#xff0c;检查是否有行锁&#xff0c;如果没有&#xff0c;才可以获…

华为mate40营销之我见

华为mate40营销之我见 产品策略 华为深厚的创新研发实力也为华为手机产品提供了保障&#xff0c;不仅拥有多项专利&#xff0c;还成功自主研发芯片&#xff0c;2016全球企业研发投入排行榜中华为排名世界第八、中国第一。华为智能手机主要采取差异化策略&#xff0c;针对不同…