【JS基础】call apply bind

server/2025/1/12 10:39:47/

三者的区别

  1. 三者多可以显式绑定函数的this指向
  2. 三者第一个参数都是this指向的对象,若该参数为undefinednull,this则默认指向全局window
  3. 传参不同,apply是数组,call是参数列表,而bind可以分为多次传入,实现参数合并
  4. call、apply是立即执行,bind是返回绑定this之后的函数,如果这个新的函数作为构造函数被调用,那么this不再指向传入给bind的第一个参数,而是指向新生成的对象

myCall

在调用 func 时要使用的 this 值。如果函数不在严格模式下,null 和 undefined 将被替换为全局对象,并且原始值将被转换为对象。

如果省略第一个 thisArg 参数,则默认为 undefined。在非严格模式下,this 值将被替换为 globalThis(类似于全局对象)。

Function.prototype.myCall = function (thisArg, ...args) {thisArg = thisArg || windowlet fn = Symbol()// this指向调用的call函数thisArg[fn] = this// 隐式绑定this,如执行obj.foo(),this指向objlet result = thisArg[fn](...args)// 执行完后删除增加的属性delete thisArg[fn]return result
}

myApply

thisArg
调用 func 时提供的 this 值。如果函数不处于严格模式,则 null 和 undefined 会被替换为全局对象,原始值会被转换为对象。

argsArray 可选
一个类数组对象,用于指定调用 func 时的参数,或者如果不需要向函数提供参数,则为 null 或 undefined。

Function.prototype.myApply = function (thisArg, args) {thisArg = thisArg || windowlet fn = Symbol()// this指向调用的call函数thisArg[fn] = this// 隐式绑定this,如执行obj.foo(),this指向objlet result = thisArg[fn](...args)// 执行完后删除增加的属性delete thisArg[fn]return result
}

myBind

bind 是返回绑定this之后的函数,如果这个新的函数作为构造函数被调用,那么this不再指向传入给bind的第一个参数,而是指向新的实例

thisArg
在调用绑定函数时,作为 this 参数传入目标函数 func 的值。如果函数不在严格模式下,null 和 undefined 会被替换为全局对象,并且原始值会被转换为对象。如果使用 new 运算符构造绑定函数,则忽略该值。

arg1, …, argN 可选
在调用 func 时,插入到传入绑定函数的参数前的参数。

// bind 是返回绑定this之后的函数,如果这个新的函数作为构造函数被调用,那么this不再指向传入给bind的第一个参数,而是指向新的实例
Function.prototype.myBind = function (thisArg, ...args) {thisArg = thisArg || windowlet fn = thislet f = Symbol()const result = function (...args1) {if (this instanceof fn) {// 如果作为构造函数调用,this指向实例this[f] = fnlet res = this[f](...args, ...args1)delete this[f]return res} else {// bind返回函数作为普通函数调用时let res = thisArg[f](...args, ...args1)return res}}// 如果绑定的是构造函数,那么需要继承构造函数原型属性和方法result.prototype = Object.create(fn.prototype)return result
}

http://www.ppmy.cn/server/105256.html

相关文章

GOPATH GOBIN GO modules

go 代码组织 go 程序组成package, 一个package是一组在相同目录的源代码共同编译而成。在同一个包里,函数、类型、变量、和常量是彼此可见的。一系列相关的包组成了module。一个repo包含一个或者多个module。 GOPATH & GOBIN go build生成bin文件&#xff0c…

windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。 一、通过菜单“项目”-“管理NuGet程序包”,下载相关包 二、安装 Microsof…

前端常用npm库大全-vue,react,通用(持续更新)

构建工具 Name/GitHub/NPM描述演示地址Vite下一代的前端工具链Create React App通过运行一个命令来设置现代 Web 应用程序。Create React App中文文档通过运行一个命令来设置现代 Web 应用程序。Webpackjs强大的静态模块打包工具,主要用于现代JavaScript应用的构建…

内存函数memcpy和memmove

memcpy 内存拷贝 函数原型:void * memcpy(void * destination , void * source, size_t num); 函数mencpy从source的位置开始向后复制num个字符的数据到destinaton的内存位置这个函数遇到’\0’并不会停下来如果source和destination有任何的重叠,复制的…

Go 内存分配:结构体中的优化技巧

在使用Golang进行内存分配时,我们需要遵循一系列规则。在深入了解这些规则之前,我们需要先了解变量的对齐方式。 Golang的unsafe包中有一个函数Alignof,签名如下: func Alignof(x ArbitraryType) uintptr对于任何类型为v的变量x…

python爬虫源码:selenium+browsermobproxy实现浏览器请求抓取

前言 如上篇博客所述:为了抓取所有,通过浏览器F12可以看到的资源(静态资源和接口调用),我使用了seleniumbrowsermobproxy的方案来处理。 这是两个模块的安装方案,没有看过的朋友可以去了解一下:…

Docker 启动单机版ES

官方安装教程:https://www.elastic.co/guide/en/elasticsearch/reference/8.14/docker.html#_linux 调整vm.max_map_count CentOS 7.9中,默认的vm.max_map_count值是65536。这个值表示一个进程可以拥有的虚拟内存区域(VMA, Virtual Memory …

基于单片机的仿生水母水下机器人设计

摘 要 : 文章对水母喷水推进的运动方式进行建模 , 设计了仿生水母的机械结构 , 并重点设计了基于单片机的控制系统, 完成了基于单片机的仿生水母水下机器人的设计 , 具有一定的应用价值 。 关键词 : 单片机…