前端祖传三件套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() 方法是非常实用的语言特性,可以帮助您更好地编写代码,并且提高程序的灵活性和可维护性。在实际工作中,需要仔细考虑函数调用的方式和参数传递的方法,以确保程序的正确性和性能。

目录
相关文章
|
1月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
50 5
|
1月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
75 1
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
29 1
|
4月前
|
前端开发 JavaScript 开发者
揭秘JavaScript魔法三剑客:call、apply、bind,解锁函数新世界,你的前端之路因它们而精彩!
【8月更文挑战第23天】在 JavaScript 的世界里,`call`、`apply` 和 `bind` 这三个方法常常让新手感到困惑。它们都能改变函数执行时的上下文(即 `this` 的指向),但各有特点:`call` 接受一系列参数并直接调用函数;`apply` 则接收一个参数数组,在处理不确定数量的参数时特别有用;而 `bind` 不会立即执行函数,而是创建一个新版本的函数,其 `this` 上下文已被永久绑定。理解这三个方法能帮助开发者更好地运用函数式编程技巧,提升代码灵活性和可维护性。
45 0
|
2月前
|
JavaScript 前端开发
JS高级—call(),apply(),bind()
【10月更文挑战第17天】call()`、`apply()`和`bind()`是 JavaScript 中非常重要的工具,它们为我们提供了灵活控制函数执行和`this`指向的能力。通过合理运用这些方法,可以实现更复杂的编程逻辑和功能,提升代码的质量和可维护性。你在实际开发中可以根据具体需求,选择合适的方法来满足业务需求,并不断探索它们的更多应用场景。
14 1
|
3月前
|
JavaScript 前端开发
this指向的几种情况以及js简单实现call、apply、bind___六卿
本文讨论了JavaScript中`this`的指向规则,并提供了`call`、`apply`和`bind`方法的简单实现,用于改变函数的`this`指向。
20 0
this指向的几种情况以及js简单实现call、apply、bind___六卿
|
3月前
|
JavaScript
js的this与call,apply,bind
js的this与call,apply,bind
|
5月前
|
JavaScript
js【详解】call()、apply()、bind()方法
js【详解】call()、apply()、bind()方法
44 6