前端祖传三件套JavaScript的函数之call()方法/apply()方法

简介: 在JavaScript中,函数是一种非常重要的语言特性,可以帮助我们实现各种功能。 Function.prototype上提供了两个函数 call() 和 apply(),它们允许您在调用函数时指定this的值,以及传递参数。本文将介绍这两个方法的用法、区别和注意事项。


一、call() 方法

  1. 语法:
function.call(thisArg, arg1, arg2, ...)

其中,thisArg 是一个对象,arg1、arg2 等是函数的实际参数。

  1. 作用:

call() 方法允许您在调用函数时设置函数内部 this 的值,并且可以将多个参数传递给函数。

  1. 示例:
const person = {
  name: 'Jack',
  age: 18,
  sayHello: function (message) {
    console.log(message + ', I am ' + this.name + ', ' + this.age + ' years old.');
  }
};
person.sayHello('Hi'); // 输出: Hi, I am Jack, 18 years old.
const anotherPerson = {
  name: 'John',
  age: 20
}
person.sayHello.call(anotherPerson, 'Hello'); // 输出: Hello, I am John, 20 years old.

二、apply() 方法

  1. 语法:
function.apply(thisArg, [argsArray])

其中,thisArg 是一个对象,argsArray 是一个包含函数参数的数组或类数组对象。

  1. 作用:

apply() 方法也允许您在调用函数时设置函数内部的 this 值,并且可以将多个参数传递给函数。与 call() 方法不同的是,apply() 方法接受参数的方式是数组或类数组对象。

  1. 示例:
const person = {
  name: 'Jack',
  age: 18,
  sayHello: function (message, country) {
    console.log(message + ', I am ' + this.name + ', ' + this.age + ' years old. I come from ' + country);
  }
};
person.sayHello('Hi', 'China'); // 输出: Hi, I am Jack, 18 years old. I come from China.
const anotherPerson = {
  name: 'John',
  age: 20
}
person.sayHello.apply(anotherPerson, ['Hello', 'USA']); // 输出: Hello, I am John, 20 years old. I come from USA.

三、call() 和 apply() 的区别

最主要的区别在于参数传递的方式不同,call() 方法是按照参数列表传递的,而 apply() 方法是通过数组或类数组对象传递的。

例如:

let arr = [1, 2, 3];
let max = Math.max.call(null, ...arr);
let min = Math.min.apply(null, arr);

四、注意事项

  1. 在使用 call() 或 apply() 方法时,如果第一个参数为 null 或 undefined,那么它们会被替换为全局对象 window。
  2. 在使用 call() 或 apply() 方法时,如果第一个参数是一个基本类型,那么 JavaScript 会在内部将其转换为对应的对象类型。

五、总结

JavaScript 中的 call() 和 apply() 方法是非常实用的语言特性,可以帮助您更好地编写代码,并且提高程序的灵活性和可维护性。在实际工作中,需要仔细考虑函数调用的方式和参数传递的方法,以确保程序的正确性和性能。

目录
相关文章
|
6月前
|
JavaScript 前端开发 API
|
7月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
369 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
JSON 前端开发 JavaScript
前端工具方法整理
前端工具方法整理
114 8
|
6月前
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
255 8
|
7月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
6563 24
|
8月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
232 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
11月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
177 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
946 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
275 0
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
410 6