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

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日

相关文章

  • vue parseHTML源码解析hars end comment钩子函数

    Vue.js是一个流行的前端框架,提供了丰富的解决方案来构建应用。其中之一就是可以使用parseHTML方法来解析HTML字符串,并生成对应的AST树。在这个解析过程中,Vue提供了一些hooks来让我们在解析过程中添加一些自定义的逻辑,其中就包括end和comment这两个hooks。 什么是parseHTML Vue提供了一个辅助函数parseHTML,…

    JavaScript 2023年6月10日
    00
  • javascript Math.random()随机数函数

    下面是关于JavaScript中 Math.random() 随机数函数的详细讲解: 什么是Math.random()函数? Math.random() 是JavaScript的内置函数之一,用于生成一个伪随机数,范围在0到1之间(包含0但不包含1)。 在使用 Math.random()生成随机数时,我们经常会通过一些算法(比如乘以所需随机数范围,然后用 M…

    JavaScript 2023年5月27日
    00
  • JavaScript中this函数使用实例解析

    JavaScript中this函数使用实例解析 简介 JavaScript中this关键字是一个很重要的概念,因为它能够让我们在函数中引用当前对象,从而处理一些复杂的逻辑。但是,由于JavaScript的this关键字的指向并不总是我们想象中的那样,因此在使用时需要仔细考虑。本文结合示例代码,详细讲解this的使用。 this关键字的指向 在JavaScri…

    JavaScript 2023年6月11日
    00
  • 从面试题学习Javascript 面向对象(创建对象)

    很高兴能够为你详细讲解“从面试题学习Javascript 面向对象(创建对象)”的完整攻略。下面我将为你提供详细的自学指导及相关示例。 学习Javascript面向对象的创建对象 了解Javascript中对象的创建方式 在Javascript中,有多种创建对象的方式,包括: 对象字面量语法 构造函数 Object.create方法 工厂函数等 在学习创建对…

    JavaScript 2023年5月27日
    00
  • JavaScript学习笔记之函数记忆

    JavaScript学习笔记之函数记忆攻略 什么是函数记忆 函数记忆是一种提高程序效率的技巧,它利用了JavaScript中对象的属性访问速度比函数调用速度快的特点。通常使用函数记忆的场景是在函数的计算结果可以被缓存的情况下,避免重复计算,从而提高程序的性能。 如何实现函数记忆 函数记忆主要是通过缓存函数的计算结果来实现的。缓存可以使用对象来实现,对象的属性…

    JavaScript 2023年5月27日
    00
  • javascript实现unicode和字符的互相转换

    javascript实现unicode和字符的互相转换是一个比较常见的需求,下面是一些常见实现方式: 使用charCodeAt()方法将字符转换成unicode JavaScript中有一个内置方法叫做charCodeAt(),可以返回指定位置的字符的Unicode值。使用该方法,可以将字符转换成对应的Unicode值。 下面是一个将字符串中的每个字符转换成…

    JavaScript 2023年5月19日
    00
  • CSS语法与JSON、JS对象区别比较

    下面是关于“CSS语法与JSON、JS对象区别比较”的详细讲解: CSS语法 CSS(Cascading Style Sheets)是一种用于描述网页样式的语言,它与HTML结合起来,可以使网页达到更好的视觉效果。CSS样式通常是在样式表中定义的,这些样式表可以是外部样式表、内部样式表或者内联样式。 CSS的基本语法结构如下: 选择器 { 属性名1: 属性值…

    JavaScript 2023年5月27日
    00
  • JavaScript解析任意形式的json树型结构展示

    为了解析任意形式的JSON树型结构,我们可以使用递归函数来实现。这里提供以下步骤: 获取JSON数据,并将其转换为JavaScript对象。 建立一个树形结构,通常使用ul和li元素,表示根节点和子节点。 创建递归函数。该函数将遍历树的节点,找到每个节点的子节点,并将它们添加到相应的父节点下。 以下是一个简单的示例: 假设我们有以下JSON数据: { &qu…

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