JavaScript中call,apply,bind的区别与实现

yizhihongxing

JavaScript中的call, apply, bind这三个方法都用于改变函数的this指向。下面分开讲解它们的用途、区别以及实现原理。

1. call方法

1.1 用途

call方法可以借用另一个对象的方法,并且将this指向当前对象。

1.2 示例说明

以下是一个简单的示例,调用Array.prototype.push方法将一个数组合并到另一个数组中。

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

Array.prototype.push.call(arr1, ...arr2);

console.log(arr1); // [1, 2, 3, 4, 5, 6]

在这个例子中,我们借用了Array.prototype.push方法,并将它的this指向了arr1对象。

2. apply方法

2.1 用途

apply方法和call方法一样,可以借用另一个对象的方法,但是参数需要以数组的形式传递。

2.2 示例说明

下面的示例展示了如何使用apply方法。

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

Array.prototype.push.apply(arr1, arr2);

console.log(arr1); // [1, 2, 3, 4, 5, 6]

在这个示例中,我们使用了apply方法,它的参数需要以数组的形式传递,并将Array.prototype.push方法的this指向arr1。

3. bind方法

3.1 用途

bind方法用于创建一个新函数,并将它的this指向指定的对象,但是不会立即执行函数。

3.2 示例说明

以下是一个示例,演示了如何使用bind方法。

function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log(this.name);
};

const cat = new Animal('Kitty');

const sayCatName = cat.sayName.bind(cat);

sayCatName(); // 输出 "Kitty"

在这个示例中,我们使用bind方法创建了一个新函数sayCatName,并将它的this指向了cat,调用它时,它的this将会指向cat,输出了"Kitty"。

4. 实现原理

call、apply、bind这三个方法的实现原理都类似,以下是它们的伪代码实现:

Function.prototype.myCall = function(thisArg) {
  // 判断是否是函数调用
  if (typeof this !== 'function') {
    throw new TypeError('not callable');
  }

  // 保证thisArg是一个对象
  thisArg = thisArg || window;

  // 使用Symbol类型创建独一无二的键名
  const key = Symbol();

  // 将当前函数作为thisArg对象的一个方法
  thisArg[key] = this;

  // 执行函数并获取返回值
  const args = [].slice.call(arguments, 1);
  const result = thisArg[key](...args);

  // 删除新增的方法并返回执行结果
  delete thisArg[key];
  return result;
};

Function.prototype.myApply = function(thisArg, args = []) {
  if (typeof this !== 'function') {
    throw new TypeError('not callable');
  }

  thisArg = thisArg || window;

  const key = Symbol();

  thisArg[key] = this;

  const result = thisArg[key](...args);

  delete thisArg[key];
  return result;
};

Function.prototype.myBind = function(thisArg, args = []) {
  if (typeof this !== 'function') {
    throw new TypeError('not callable');
  }

  thisArg = thisArg || window;

  const fn = this;

  return function() {
    const innerArgs = [].slice.call(arguments);
    const argsList = args.concat(innerArgs);
    return fn.apply(thisArg, argsList);
  };
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript中call,apply,bind的区别与实现 - Python技术站

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

相关文章

  • JavaScript三种方法解决约瑟夫环问题的方法

    JavaScript三种方法解决约瑟夫环问题的方法 1. 问题描述 约瑟夫环问题是一种很有趣的数学问题,描述如下: 有N个人围成一个圆圈,从第一个人开始报数,数到M的那个人出列,直到剩下最后一个人。例如,当N=6,M=5时,编号依次为1、2、3、4、5、6的6个人围成一圈,从1开始报数,数到5的那个人出列,直到剩下最后一个人。 2. 问题解析 要解决约瑟夫环…

    JavaScript 2023年5月28日
    00
  • javascript html5实现表单验证

    JavaScript HTML5实现表单验证 表单验证是Web应用程序中非常重要的功能,可以帮助我们避免用户输入无效或不正确的数据,提高用户体验和数据准确性。在HTML5中,JavaScript可以轻松实现表单验证而无需从头编写自定义验证规则。 设置HTML5表单验证规则 HTML5中,可以使用各种内置的验证规则来检查表单字段。这些验证规则基于HTML5表单…

    JavaScript 2023年6月10日
    00
  • js格式化时间的方法

    JS格式化时间是前端开发中一个非常基础的操作,我们可以使用JS内置的日期对象和字符串的方法来完成。下面我将介绍JS格式化时间的方法。 一、JS内置的日期对象 在JS中,我们可以通过日期对象Date来获取当前的年月日时分秒等信息。 let date = new Date(); console.log(date.getFullYear()); // 获取当前的年…

    JavaScript 2023年5月27日
    00
  • JavaScript中使用stopPropagation函数停止事件传播例子

    下面是详细讲解“JavaScript中使用stopPropagation函数停止事件传播”的攻略。 一、什么是事件传播 在 JavaScript 中,事件传播是指一个正在执行的事件被传递到多个目标元素时的行为。当事件发生时,它将从最深嵌套的 DOM 元素(称为目标)开始,然后传递到 DOM 树的根,逐步往上传递,直到文档的顶部。事件可以在传播的过程中被捕获和…

    JavaScript 2023年5月28日
    00
  • javascript下判断一个对象是否具有指定名称的属性的的代码

    要判断一个 JavaScript 对象是否具有指定名称的属性,可以使用 in 或者 hasOwnProperty() 方法。 使用 in 关键字进行属性判断 in 关键字可以用于判断一个对象是否具有指定名称的属性,返回布尔值 true 或 false。 const person = { name: ‘张三’, age: 20 }; // 判断对象是否具有指定…

    JavaScript 2023年5月27日
    00
  • js中编码函数:escape,encodeURI与encodeURIComponent详解

    JS中编码函数:escape, encodeURI与encodeURIComponent详解 Introduction 在JavaScript中,编码和解码字符串是非常重要的过程。我们经常需要将特殊字符转义,保证它们可以正确的在URL或者HTML中使用。本篇文章将详细讲解JS中三个编码函数:escape, encodeURI与encodeURICompone…

    JavaScript 2023年5月20日
    00
  • JavaScript中SetInterval与setTimeout的用法详解

    JavaScript中SetInterval与setTimeout的用法详解 SetInterval 概念 setInterval()是JavaScript中的一个全局函数,用于创建一个可以重复执行的定时器。 语法 setInterval(func, delay, [param1, param2, …]); func:定时器每次运行时要调用的函数 del…

    JavaScript 2023年5月27日
    00
  • JavaScript 定时器关键点及使用场景解析

    JavaScript 定时器关键点及使用场景解析 什么是 JavaScript 定时器? JavaScript 定时器是一种用于在指定时间间隔后执行一段 JavaScript 代码的机制。在开发中,我们通常需要在特定的时间间隔内执行某些操作,这时就可以使用 JavaScript 定时器。 JavaScript 提供了两种定时器: setInterval se…

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