面试题之介绍下call,apply,bind相同点和不同点

ops/2025/2/22 17:26:41/

callapply bind  是 JavaScript 中用于改变函数执行时 this 指向的方法。


1. call 方法

call 方法允许你调用一个函数,并显式地指定函数内部的 this 值,同时可以传递参数。

语法:

JavaScript复制

function.call(thisArg, arg1, arg2, ...);
  • thisArg:函数内部的 this 值。

  • arg1, arg2, ...:传递给函数的参数。

示例:

function greet(...message) {
  console.log(`${message}, my name is ${this.name}`);
}

const person = { name: "Alice" };

greet.call(person, "Hello","hi","嘻嘻"); // 输出: Hello,hi,嘻嘻, my name is Alice


2. apply 方法

apply 方法与 call 类似,也用于调用一个函数并显式地指定函数内部的 this 值,但它的参数是以数组的形式传递的。

语法:

JavaScript复制

function.apply(thisArg, [argsArray]);
  • thisArg:函数内部的 this 值。

  • [argsArray]:一个数组,包含要传递给函数的参数。

示例:

function greet(...message) {
  console.log(`${message}, my name is ${this.name}`);
}

const person = { name: "Alice" };

greet.apply(person, ["Hello","hi","嘻嘻"]); // 输出: Hello,hi,嘻嘻, my name is Alice

3. bind 方法

bind 方法用于创建一个新的函数,并将该函数的 this 值永久绑定到指定的对象上。与 callapply 不同,bind 不会立即调用函数,而是返回一个新的函数。

语法:

const newFunction = function.bind(thisArg, arg1, arg2, ...);
  • thisArg:绑定到新函数的 this 值。

  • arg1, arg2, ...:预绑定的参数(可选)。

示例:

function greet(...message) {
  console.log(`${message}, my name is ${this.name}`);
}

const person = { name: "Alice" };

const greetAlice = greet.bind(person, "Hello","hi");
greetAlice("嘻嘻"); // 输出: Hello,hi,嘻嘻, my name is Alice


相同点

  1. 目的相同callapplybind 都用于改变函数执行时的上下文(this 值)。

  2. 参数传递:都可以传递参数给目标函数(callapply 是直接调用,bind 是预绑定)。

  3. 用途广泛:都可以用于继承、函数借用、模拟私有方法等场景。


不同点

  1. 调用方式

    • call直接调用函数,参数逐个传递

    • apply直接调用函数,参数以数组形式传递。

    • bind:返回一个新的函数,this 值和参数被预绑定,需要手动调用。

  2. 是否立即执行

    • callapply立即调用目标函数。

    • bind返回一个新的函数,不会立即执行。

  3. 参数传递方式

    • call参数逐个传递。

    • apply参数以数组形式传递。

    • bind预绑定参数,后续调用时可以补充参数。

  4. 应用场景

    • callapply通常用于立即调用函数并改变上下文。

    • bind:用于创建一个上下文固定的函数,常用于事件处理、回调函数等场景。


总结

  • callapply:都用于立即调用函数并改变上下文,区别在于参数传递方式(call 是逐个传递,apply 是数组传递)。

  • bind:返回一个新的函数,this 值和参数被预绑定,适合需要延迟调用的场景

  • 选择方法:根据是否需要立即调用以及参数传递方式来选择 callapplybind

这些方法在 JavaScript 中非常强大,可以帮助你更好地控制函数的上下文和参数传递。


http://www.ppmy.cn/ops/160153.html

相关文章

【大语言模型_3】ollama本地加载deepseek模型后回答混乱问题解决

背景: 本地下载了DeepSeek-R1-Distill-Qwen-7B模型后,通过ollama create DeepSeek-R1-Distill-Qwen-7B -f ds7b.mf加载模型启动后回答混乱,无法使用。 解决方法 重新下载模型,选择了DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf 重…

部署前端项目

前端项目部署是指将前端应用程序从开发环境转移到生产环境的过程,涉及上传代码和资源文件至服务器并确保其正确运行,以下是详细步骤: 一、前期准备 检查项目依赖:确保项目的所有依赖都已正确安装,并更新到最新版本。常…

手写简易RPC(实践版)

首先了解rpc rpc-远程过程调用,openFeign,Dubbo都可以算作rpc,以微服务来具体说明,就是在本地不需要去发送请求,通过rpc框架,像调用本地方法一样调用其他服务的方法,本质上还是要经过网络&…

Unity之Serialized序列化:从原理到实践

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之Serialized序列化:从原理到实践 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心…

uniapp录制语音

给大家讲解瞎 录制语音 的功能,这部分主要涉及到以下几个步骤:开始录音、停止录音、播放录音的功能 1.开始录音 (startRecording 函数) 当用户点击 开始录音 按钮时,调用 startRecording 函数开始录音。录音通过 uni.getRecorderManager() …

人工智能(AI)的不同维度分类

人工智能(AI)的分类 对机器学习进行分类的方式多种多样,可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的: 1、按数据模态不同:图像,文本,语音,多态等 2、按目标函数不同:判别式模型…

AIGC视频生成明星——Emu Video模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video,作为Meta发布的第二款视频生成模型,在视频生成领域发挥关键作用。 🌺优质专栏回顾&am…

DeepSeek-R1本地部署详细指南!(Ollama+Chatbox AI+Open WebUI)

一、前言 DeepSeek(深度求索)是一家中国人工智能企业,其在人工智能领域取得了显著成果,特别是其发布的新一代大模型DeepSeek-R1和DeepSeek-V3,受到了广泛关注。 DeepSeek官网:https://www.deepseek.com/ …