JS中call apply bind函数手写实现demo

yizhihongxing

下面是关于“JS中call apply bind函数手写实现demo”的攻略:

理解call、apply、bind函数

在手写这三个函数的过程中,我们必须先清楚地理解这三个函数的作用:

  • call函数:调用一个函数,将一个对象作为第一个参数,以及多个参数传入该函数。
  • apply函数:调用一个函数,将一个对象作为第一个参数,以及一个参数数组传入该函数。
  • bind函数:创建一个新函数,该函数与原始函数具有相同的函数体,但this值被永久地绑定到了bind函数的第一个参数中。

手写call函数

call函数的实现过程如下:

Function.prototype.myCall = function (context) {
  // 首先要获取调用call的函数,用this可以获取
  const calledFunc = this

  // context为传入的需要调用函数的对象
  context = context || window

  // 从arguments中获取到需要传递的参数
  const args = [...arguments].slice(1)

  // 将该函数作为传入的对象的方法调用,以改变函数的this指针
  context.fn = calledFunc

  // 最后把参数传入进去并执行
  const result = context.fn(...args)

  // 删除对象上的方法
  delete context.fn

  return result
}

示例:

function sayName() {
  console.log(this.name)
}

const person = { name: 'Lucas' }

sayName.myCall(person) // 'Lucas'

手写apply函数

apply函数的实现过程如下:

Function.prototype.myApply = function (context) {
  // 首先要获取调用apply的函数,用this可以获取
  const calledFunc = this

  // context为传入的需要调用函数的对象
  context = context || window

  // 从arguments中获取到需要传递的参数
  const args = arguments[1]

  // 将该函数作为传入的对象的方法调用,以改变函数的this指针
  context.fn = calledFunc

  // 最后把参数传入进去并执行
  const result = context.fn(...args)

  // 删除对象上的方法
  delete context.fn

  return result
}

示例:

function sayName(age) {
  console.log(`My name is ${this.name}, and I'm ${age} years old`)
}

const person = { name: 'Lucas' }

sayName.myApply(person, [25]) // 'My name is Lucas, and I'm 25 years old'

手写bind函数

bind函数的实现过程如下:

Function.prototype.myBind = function (context) {
  // 首先要获取调用bind的函数,用this可以获取
  const calledFunc = this

  // context为传入的需要调用函数的对象
  context = context || window

  // 从arguments中获取到需要传递的参数
  const args = [...arguments].slice(1)

  // 返回一个新的函数,此时该函数的this指向已经绑定到了context上
  return function () {
    const newArgs = args.concat([...arguments])
    return calledFunc.apply(context, newArgs)
  }
}

示例:

function sayName(age) {
  console.log(`My name is ${this.name}, and I'm ${age} years old`)
}

const person = { name: 'Lucas' }

const sayNameWithPerson = sayName.myBind(person)

sayNameWithPerson(25) // 'My name is Lucas, and I'm 25 years old'

总结

通过手写call、apply、bind这三个函数,可以更深刻地理解它们的作用,并且掌握函数指针和this的相关知识点。在实际编码中,也可以更加灵活地应用这些函数,让代码实现更加简洁高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中call apply bind函数手写实现demo - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js判断所有表单项不为空则提交表单的实现方法

    下面是实现方法的完整攻略: 一、获取表单元素 在提交表单前,我们首先需要获取表单里的所有输入元素的值,然后进行判断。可以使用以下方法获取表单元素: const input_elements = document.querySelectorAll(‘input[required]’); 上面的代码调用了 querySelectorAll()方法,选择了所有带有…

    JavaScript 2023年6月10日
    00
  • 最常用的15个前端表单验证JS正则表达式

    对于最常用的15个前端表单验证JS正则表达式,我们可以进行如下详细讲解: 简介 前端表单验证是前端开发中需要经常用到的技术之一。而在前端表单验证中,使用正则表达式是最常见的方式之一。本文将介绍最常见的15个前端表单验证JS正则表达式,并提供详细的使用示例。 常见的15个前端表单验证JS正则表达式 以下是最常见的15个前端表单验证JS正则表达式,可以根据需要进…

    JavaScript 2023年6月10日
    00
  • JavaScript中解析JSON数据的三种方法

    JavaScript中解析JSON数据的三种方法涉及到解析JSON的格式,这里我们假设需要解析的JSON数据为以下格式: { "name": "John Doe", "age": 30, "isAdmin": true, "hobbies": [ "…

    JavaScript 2023年5月27日
    00
  • javascript 防止刷新,后退,关闭

    防止刷新、后退和关闭网页通常可以使用 JavaScript 实现。以下是标准的 Markdown 格式文本回答。 防止刷新、后退和关闭网页的方法 防止刷新网页 要防止刷新网页,最简单的方法是使用 beforeunload 事件。在页面加载时,添加以下代码: window.addEventListener(‘beforeunload’, function(ev…

    JavaScript 2023年6月11日
    00
  • javascript数组元素删除方法delete和splice解析

    JavaScript数组元素删除方法delete和splice解析 对于JavaScript数组,删除操作是常见的一种操作,但是我们可以使用不同的方法进行删除操作,其中最常用的有删除元素的方法delete和splice。 delete方法 delete方法会将对应下标的元素删除,但是会保留这个位置,也就是说对于这个数组来说,这个位置还是存在的,只是该位置的值…

    JavaScript 2023年5月27日
    00
  • JavaScript内置日期、时间格式化时间实例代码

    让我来为您详细讲解一下 “JavaScript内置日期、时间格式化时间实例代码” 的完整攻略。 什么是日期、时间格式化? 格式化是指将一个变量的值以一定的格式输出。在 JavaScript 中,我们可以使用内置的 Date() 对象和相关方法进行日期、时间格式化。 如何使用内置日期、时间格式化实例代码? 获取当前时间 获取当前时间的方式有两种,分别是使用 n…

    JavaScript 2023年5月27日
    00
  • asp.net+ajax的Post请求实例

    下面是关于“ASP.NET+Ajax的post请求实例”的攻略。 什么是Ajax? Ajax(Asynchronous JavaScript and XML)是一种用于创建 Web 应用的技术。它可以让浏览器不重新加载整个页面的情况下,动态地更新页面上的一部分内容。使用 Ajax 技术可以使网页更加流畅和响应。 什么是ASP.NET? ASP.NET 是一种…

    JavaScript 2023年6月11日
    00
  • js打造数组转json函数

    下面给出 JS 打造数组转 JSON 函数的完整攻略。这里的数组指的是 JavaScript 中的数组类型。 前言 JSON(JavaScript Object Notation)是一种轻量级的数据序列化格式,它被广泛应用于 Web 应用程序中的数据交换。在前端开发中,我们通常需要将数据从 JavaScript 中的数组类型转化为 JSON 格式,以便将数据…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部