首页 > 其他分享 >说说bind、call、apply的区别?并手写实现一个bind的方法

说说bind、call、apply的区别?并手写实现一个bind的方法

时间:2025-01-13 09:22:15浏览次数:1  
标签:name bind greeting call apply John

bindcallapply 都是 JavaScript 中改变函数执行上下文的方法,他们的主要区别体现在调用函数时所传递的参数形式上。

  1. callcall 方法接收一个参数列表,第一个参数将用作函数中的 this 对象,其余参数将直接作为函数调用时的参数。
function greet(greeting, name) {
    console.log(`${greeting}, ${this.name}`);
}

let obj = {name: 'John'};

greet.call(obj, 'Hello', 'John');  // 输出: Hello, John
  1. applyapply 方法和 call 类似,不同之处在于 apply 接收的是一个包含函数参数的数组(或类数组对象),而 call 接收的是一系列单独的参数。
function greet(greeting, name) {
    console.log(`${greeting}, ${this.name}`);
}

let obj = {name: 'John'};

greet.apply(obj, ['Hello', 'John']);  // 输出: Hello, John
  1. bindbind 方法创建一个新的函数,该函数在被调用时将设置为指定的 this 值,并在调用时将其预置的参数传给原函数。与 callapply 不同,bind 不会立即执行函数。
function greet(greeting, name) {
    console.log(`${greeting}, ${this.name}`);
}

let obj = {name: 'John'};
let boundFunc = greet.bind(obj, 'Hello');

boundFunc();  // 输出: Hello, John

下面是一个简单的 bind 方法的实现:

Function.prototype.myBind = function(context, ...args1) {
    // 保存原函数
    let originFunc = this;
    // 返回一个新的函数
    return function(...args2) {
        // 当新函数被调用时,将预设的参数和新传入的参数合并,并在指定的上下文中执行原函数
        originFunc.apply(context, [...args1, ...args2]);
    }
};

这个简单的 myBind 方法可以模拟 bind 的基本功能,即预设函数的参数,并设置函数执行的上下文。但请注意,这个简单的实现并没有处理 bind 方法的一些高级特性,如 new 操作符的兼容性等。在实际应用中,可能需要更复杂的实现来处理这些边缘情况。

标签:name,bind,greeting,call,apply,John
From: https://www.cnblogs.com/ai888/p/18667840

相关文章

  • 解决 Git SSL 连接错误:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno
    问题描述在执行gitpull命令时遇到以下错误:>gitpull--tagsoriginmainfatal:unabletoaccess'对应github仓库':OpenSSLSSL_read:SSL_ERROR_SYSCALL,errno0这个错误通常表示Git在尝试通过HTTPS连接到GitHub时遇到了SSL连接问题。解决方案1.检查网络......
  • 生信技能69 - 使用deepvariant对基因组指定区域Calling SNPs/Indels
    基于比对排序去除重复后的BAM文件,使用deepvariant进行Calling变异,可指定基因组区域(染色体编号:开始位置-结束位置格式),docker封装,适用于CallingSNPs/Indels及基于VCF的基因分型等,在输出目录生成VCF文件。1.deepvariant分析示例参数1:工作分型的目录(变异VCF文件输出的目录......
  • 使用Arthur Callback Handler监控和记录Chat LLM推理
    在现代AI开发中,监控和记录模型的推理过程是保证模型性能和行为一致性的关键步骤。本文将介绍如何利用Arthur平台的回调处理程序(ArthurCallbackHandler)来自动记录已注册的聊天语言模型(LLM)推理。技术背景介绍Arthur是一个专注于模型监控和可观测性的强大平台。它帮助......
  • netplan apply报错No module named ‘netifaces‘
    Ubuntu20.04.5LTS\n\l,ctrl+alt+f2切换字符登录f1切换图形处理办法:root登录执行root@node37:/disk1/Qwen2.5-72B-Instruct-GPTQ-Int4#cat/etc/netplan/01-network-manager-all.yaml #LetNetworkManagermanagealldevicesonthissystemnetwork: version:2......
  • linux kernel 如何bind() VRF端口上的源IP
     前文  linuxkernelbind()时发生了什么 讲了bind()的实现机制。今天,我用bind()绑定一个VRF上的源IP,发生如下报错:bind(11.1.1.64)failed(99:Cannotassignrequestedaddress) 经过分析kernel代码,确认需要先设置setsockopt(SO_BINDTODEVICE)细节如下:bind()用dev_if......
  • 10分钟白话call、apply、bind八股文
    主题:用最简单,通俗白话解说。目标1:学好一个call小目标,另外2个旁通soeasy正题入口:作用1:call函数的调用意思是函数的方法实践出真知:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"cont......
  • [20250109]dbms_xplan.display_cursor+peeked_binds无法查看绑定变量值.txt
    [20250109]dbms_xplan.display_cursor+peeked_binds无法查看绑定变量值.txt--//在我使用自己写的dpc.sql脚本中我会加入peeked_binds参数查看绑定变量值,但是有时候会遇到无法查看的情况。--//以前自己很少关注这个细节,应该有别的途径获取绑定变量值,最近在优化一条sql语句正好遇到,......
  • linux kernel bind()时发生了什么
    配置实验一下,我有两个口lo和enp0s3,两个地址,如下所示。 真实物理口测试访问同子网的10.0.2.2如果没有地址,返回:Cannotassignrequestedaddress,说明bind失败了。 lo口测试访问loopback地址127.0.0.1如果没有地址,返回:Cannotassignrequestedaddress,说明bind失败了......
  • 什么是 pybind11?
    什么是pybind11?pybind11是一个轻量级的C++库,用于将C++代码与Python代码连接起来。它允许你轻松地在Python中调用C++函数和类,同时保持高性能。pybind11为C++和Python之间提供了一个清晰、简单的桥梁,使得我们可以在Python中直接使用C++编写的高性能代码......
  • 为何 bind 方法绑定 this 后函数属性丢失?
    在JavaScript中,bind方法是一个非常重要的函数,它主要用于将一个函数的this 绑定到指定的对象上。然而,bind生成的新函数并不会继承原函数的属性和方法,这是因为bind创建了一个新的函数实例,而不是简单地修改原函数。1.bind方法bind是 Function.prototype上的方法。......