JS中改变this指向的方法(call和apply、bind)

yizhihongxing

JS中的函数中会有一个特殊的变量this,它代表当前函数的执行上下文。但是,由于JS是一门动态语言,函数都可以作为变量进行传递和赋值,那么函数内的this指向就可能会出现变化。在这种情况下,我们需要改变函数内this的指向,以确保函数能够正常执行。而JS中改变this指向的方法主要有三种,分别是call、apply和bind。

call

call() 方法可以调用一个函数,并且将函数内的this指向调用该函数的对象。它的语法结构为:

function.call(thisArg, arg1, arg2, ...)
  • thisArg:需要被指定为当前函数的 this 对象的值。
  • arg1, arg2, ...:传递给方法的参数列表。

如果函数不需要传递任何参数,则可以将第二个参数设为 null 或者 undefined。

示例一:改变函数内this指向

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

var obj1 = {name: 'Tom'};
var obj2 = {name: 'Jack'};

sayName.call(obj1); // 输出:Tom
sayName.call(obj2); // 输出:Jack

示例二:借用方法

function greetings() {
  console.log('你好!我是' + this.name);
}

var person = {
  name: '张三',
  age: 25
}

greetings.call(person); // 输出:你好!我是张三

apply

apply() 方法与 call() 方法作用类似,但是 apply() 方法需要将参数打包成一个数组传递。它的语法结构为:

function.apply(thisArg, [arg1, arg2, ...])
  • thisArg:需要被指定为当前函数的 this 对象的值。
  • [arg1, arg2, ...]:一个包含所有需要传递给方法的参数的数组。

如果函数不需要传递任何参数,则可以将第二个参数设为 null 或者 undefined。

示例一:改变函数内this指向

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

var obj1 = {name: 'Tom'};
var obj2 = {name: 'Jack'};

sayName.apply(obj1); // 输出:Tom
sayName.apply(obj2); // 输出:Jack

示例二:借用方法

function greetings() {
  console.log('你好!我是' + this.name);
}

var person = {
  name: '张三',
  age: 25
}

greetings.apply(person); // 输出:你好!我是张三

bind

bind() 方法与 call() 和 apply() 作用类似,但是不会立即调用函数。bind() 方法会创建一个新函数,其 this 值会被绑定到传递给 bind() 方法的值。如果调用 bind() 方法时传递了函数参数,那么这些参数会被传递给绑定后的函数。它的语法结构为:

function.bind(thisArg[, arg1[, arg2[, ...]]])
  • thisArg:需要被指定为当前函数的 this 对象的值。
  • [arg1[, arg2[, ...]]]:传递给方法的参数列表。

如果函数不需要传递任何参数,则可以省略 arg1, arg2, ... 参数。

示例一:改变函数内this指向

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

var obj1 = {name: 'Tom'};
var obj2 = {name: 'Jack'};

var sayName1 = sayName.bind(obj1);
var sayName2 = sayName.bind(obj2);

sayName1(); // 输出:Tom
sayName2(); // 输出:Jack

示例二:借用方法

function greetings() {
  console.log('你好!我是' + this.name);
}

var person = {
  name: '张三',
  age: 25
}

var greetPerson = greetings.bind(person);
greetPerson(); // 输出:你好!我是张三

以上就是改变JS函数内this指向的三种方法(call、apply、bind)的详细讲解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中改变this指向的方法(call和apply、bind) - Python技术站

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

相关文章

  • javascript简单比较日期大小的方法

    下面是关于“JavaScript简单比较日期大小的方法”的完整攻略。 核心思路 在JavaScript中,我们可以先将日期转换成时间戳,在比较时间戳大小来实现比较日期的大小。具体步骤包括: 将日期转换成时间戳; 比较时间戳大小,即可得出日期的大小。 实现方法 方法一:使用Date对象 const date1 = new Date("2021-01-…

    JavaScript 2023年5月27日
    00
  • cookie的secure属性详解

    Cookie的secure属性详解 什么是Cookie? Cookie是一种由Web服务器存储在Web浏览器上的小文本文件。当Web浏览器向同一服务器发出请求时,会将Cookie发送回服务器。在服务器处理请求时,Cookie提供了一种追踪用户的机制,以便在多个页面或跨站点之间保持状态信息。因此,Cookie是Web应用程序的重要组成部分。 Cookie的Se…

    JavaScript 2023年6月11日
    00
  • 全面解析JS字符串和正则表达式中的match、replace、exec等函数

    全面解析JS字符串和正则表达式中的match、replace、exec等函数 在JS中,字符串和正则表达式都有一些常用的函数,用于对它们进行操作。其中比较常用的包括match()、replace()和exec()函数。下面就分别来详细讲解它们的用法。 match()函数 match()函数用于在字符串中查找匹配正则表达式的内容,并返回一个包含匹配结果的数组或…

    JavaScript 2023年5月28日
    00
  • javascript删除元素节点removeChild()用法实例

    JavaScript中的removeChild方法 在JavaScript中,我们可以使用removeChild方法来删除一个指定的元素节点。该方法需要根据节点的父元素来找到要删除的节点,并从它的父元素中将该节点删除。 语法 removeChild()方法的语法如下: parentElement.removeChild(childElement) 其中,pa…

    JavaScript 2023年6月10日
    00
  • javascript判断一个变量是数组还是对象

    判断一个变量是数组还是对象是编写 JavaScript 程序中常见的任务,我们可以使用原生 JavaScript 提供的一些方法来实现这个功能。 方法一:使用 typeof 运算符和 Array.isArray() 方法 在 JavaScript 中,我们可以使用 typeof 运算符来检查一个变量的类型,Array.isArray() 方法用来判断一个变量…

    JavaScript 2023年5月27日
    00
  • java后台实现js关闭本页面,父页面指定跳转或刷新操作

    实现JS关闭本页面、父页面指定跳转或刷新操作需要通过JavaScript与Java后台交互实现。下面详细讲解完整攻略: 第一步:前端代码js关闭本页面 在前端通过JavaScript实现关闭本页面的方法为: window.close(); 第二步:通过Java后台实现父页面跳转或刷新操作 通过Java后台实现父页面的跳转或刷新操作需要借助JavaScript…

    JavaScript 2023年6月11日
    00
  • 三种方法让Response.Redirect在新窗口打开

    当使用Response.Redirect方法时,页面会在当前浏览器窗口中打开跳转的页面,如果需要在新的窗口中打开跳转页面,可以采用以下三种方法: 1. 在服务器端页面上使用ClientScript.RegisterStartupScript方法 使用ClientScript.RegisterStartupScript方法可以在服务器端页面上注册启动JavaS…

    JavaScript 2023年6月11日
    00
  • 深入浅出JavaScript中base64编码原理

    深入浅出JavaScript中base64编码原理 什么是base64编码 Base64是一种用于将二进制数据转换成ASCII字符的编码方式。它使用64个字符表示64个不同的二进制数字,每个字符表示6个二进制位,因此每3个字节需要进行编码,得到4个字符。这种编码方式常用于电子邮件和HTTP协议传输数据,因为它可以处理非文本数据。 base64编码原理 在Ja…

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