浅谈javascript的call()、apply()、bind()的用法

我会尽可能详细地讲解“浅谈javascript的call()、apply()、bind()的用法”的完整攻略。

什么是call()、apply()、bind()

在javascript中,call()、apply()、bind()都是用于修改函数执行时的上下文(即函数运行时的this指向)。

call()和apply()都可以在函数调用时改变函数体内的this指向。而且两者传参的方式有所不同。其中,call()的参数是一系列的值,而apply()的参数是一个数组。

bind()则是新生的改变this连接指向的函数,并能返回一个新的函数给我们使用。

call()、apply()的用法

示例1

function showName() {
  console.log(this.name);
}

var obj1 = {
  name: '张三'
};

showName.call(obj1); // 输出"张三"

以上示例中定义了一个函数showName(),并定义了一个对象obj1,对象中定义了一个名为name的属性。接下来,我们将showName()函数的上下文传入obj1对象,因此,在调用showName.call(obj1)时,函数内的this指向obj1,那么在控制台输出的内容就将为张三

示例2

function showInfo(message) {
  console.log(message + this.name);
}

var obj2 = {
  name: '李四'
};

showInfo.apply(obj2, ['我的名字是']); // 输出"我的名字是李四"

以上另一个示例中,我们定义了一个新的函数showInfo(),并定义了新的对象obj2,同样定义了一个名为name的属性。在调用showInfo.apply(obj2, ['我的名字是'])时,将showInfo()函数的上下文传入obj2对象,并在函数中引用了一个传递进来的message参数,最后输出的内容就变成了传递进来的messageobj2对象的name属性值。因此,在控制台输出为我的名字是李四

bind()的用法

示例3

var obj3 = {
  x: 10,
  y: 20
};

function Point() {
  this.point = [this.x, this.y];
}

var p = new Point();
console.log(p.point); // 输出"[undefined, undefined]"

var bindPoint = Point.bind(obj3);
var pBind = new bindPoint();
console.log(pBind.point); // 输出"[10, 20]"

以上示例中,我们定义了一个对象obj3,其中定义了xy两个属性。接着我们定义了一个函数Point(),同时在函数中定义了一个point数组,数组中存放的是xy的值。在调用new Point()时,我们发现数组里的this.xthis.y的值都为undefined,这是因为this指向的是Point()函数本身,而不是我们所希望的obj3对象。

因此,我们使用bind()来改变Point()函数的this指向,并将其绑定到obj3对象上,那么变量bindPoint将会是一个与Point()函数相绑定的新函数。接着我们再次调用new bindPoint()并输出其point数组中的值,那么控制台输出的内容就将为[10, 20]

总结

以上就是关于javascript中的call()apply()bind()三个函数的简介和使用方法,通过这些示例我们相信大家已经能够更加清楚地理解三者之间的区别和用法了。需要注意的是,这些函数都是可用于修改函数执行时的上下文的,而且在实际开发中常常会被使用到。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈javascript的call()、apply()、bind()的用法 - Python技术站

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

相关文章

  • 如何用threejs实现实时多边形折射

    下面是关于如何用threejs实现实时多边形折射的攻略: 简介 实时多边形折射可以让我们在视觉上模拟水或者其他材料的折射现象,从而能够提高场景的逼真程度。该技术通常使用片元着色程序来实现,并且需要一些复杂的计算和优化。在threejs中,可以使用ShaderMaterial来实现这个效果。下面是一个完整的攻略: 实现过程 1. 创建多边形模型 首先,我们需要…

    JavaScript 2023年6月11日
    00
  • JavaScript保留关键字汇总

    下面是JavaScript保留关键字汇总的完整攻略。 什么是JavaScript保留关键字 JavaScript保留关键字是指被JavaScript编程语言用作内部特定目的的单词或符号。这些单词或符号不能被作为变量名、函数名或标识符等用于代码中。如果这些关键字被用作标识符,代码就会出现编译错误。所以我们在编写JavaScript代码的时候,需要避免使用保留关…

    JavaScript 2023年5月18日
    00
  • jQuery学习3:操作元素属性和特性

    《jQuery学习3:操作元素属性和特性》是一篇介绍如何使用jQuery操作HTML元素的属性和特性的教程。该教程的学习内容主要分为以下几个方面: 获取/设置属性和特性 当我们需要获取或设置一个元素的属性或特性时,可以通过jQuery中的attr方法实现。attr方法的用法如下: // 获取一个元素的属性或特性 var value = $(‘selector…

    JavaScript 2023年6月10日
    00
  • JSON.parse损坏大数字的原因解析及解决方案

    出现问题的原因: 在使用JSON.parse()解析带有大数字的JSON字符串时,很可能会出现精度丢失的问题,导致解析后的数据与原数据不一致。这是由于JavaScript语言中最大的安全数字为 9007199254740991(2^53 – 1),超过这个数字范围后,会发生精度损失,从而导致数据不准确。 解决方案: 为了避免这种情况的发生,我们可以将JSON…

    JavaScript 2023年5月27日
    00
  • 一种新的javascript对象创建方式Object.create()

    一种新的javascript对象创建方式Object.create() Object.create()是一个比较新的JavaScript方法,它可以创建一个新对象,并将原型设置为一个已有的对象。这意味着你可以使用一个现有对象作为新对象的原型,在新对象里共享原型的属性和方法。使用Object.create()的主要优点包括: 简化代码 更简单的原型继承 字面量…

    JavaScript 2023年5月27日
    00
  • 梳理总结25个JavaScript数组操作方法实例

    首先,我们要对“梳理总结25个JavaScript数组操作方法实例”的主题进行分析和概述,以明确我们需要解决的问题和达成的目标。 主题分析 这个主题的核心是JavaScript数组操作方法的总结和使用,需要概述25个常用的方法,以便读者快速掌握数组操作技巧。我们的目标是提供一份详细的文档,方便读者进行查阅和学习。 操作步骤 为了实现上述目标,我们需要完成以下…

    JavaScript 2023年5月27日
    00
  • js中bool值的转换及“&&”、“||”、 “!!”详解

    bool是布尔类型,只有两种取值:true和false。在JavaScript中,存在一些将非布尔值转换为布尔值的规则,这些规则叫做隐式类型转换。而“&&”、“||”、 “!!”都是实现js中布尔值转换的常用操作符。 “&&”操作符 当使用“&&”操作符时,如果两个值都是true,则返回true;否则返回fal…

    JavaScript 2023年5月28日
    00
  • JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))

    JavaScript 是一门面向对象的语言,它采用基于原型链的面向对象机制,可以通过创建对象实例来实现面向对象的编程。在学习 JavaScript 面向对象知识串结的过程中,建议按照以下步骤逐一学习。 1. 理解原型及原型链 在 JavaScript 中,每个对象都有一个原型对象,原型对象也是一个对象。在对象查找成员(属性和方法)时,如果自身无法找到该成员,…

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