改变函数内部的this指向【三种方法】

改变函数内部 this 指向

前面我们讲到函数的this指向问题:JS 函数与函数【this指向问题】;那么接下来我们聊聊改变函数内this指向如何实现, js提供了三种方法 call() apply() bind(),下面细聊他们的使用方法。

call方法

call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

应用场景: 经常做继承.

var o = {
	name: 'andy'
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn(1,2)// 此时的this指向的是window 运行结果为3
fn.call(o,1,2)//此时的this指向的是对象o,参数使用逗号隔开,运行结果为3

以上代码运行结果为:
在这里插入图片描述

apply方法

apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

应用场景: 经常跟数组有关系

var o = {
	name: 'andy'
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn()// 此时的this指向的是window 运行结果为3
fn.apply(o,[1,2])//此时的this指向的是对象o,参数使用数组传递 运行结果为3

以上代码运行结果为:
在这里插入图片描述

bind方法

bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数

如果只是想改变 this 指向,并且不想调用这个函数的时候,可以使用bind

应用场景:不调用函数,但是还想改变this指向

 var o = {
 name: 'andy'
 };

function fn(a, b) {
	console.log(this);
	console.log(a + b);
};
var f = fn.bind(o, 1, 2); //此处的f是bind返回的新函数
f();//调用新函数  this指向的是对象o 参数使用逗号隔开

在这里插入图片描述

call、apply、bind三者的异同

  • 共同点 : 都可以改变this指向

  • 不同点:

    • call 和 apply 会调用函数, 并且改变函数内部this指向.
    • call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
    • bind 不会调用函数, 可以改变函数内部this指向.
  • 应用场景

    1. call 经常做继承.
    2. apply经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
    3. bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.

使用apply()方法实现获取数组最大最小值

        // 1. 也是调用函数 第二个可以改变函数内部的this指向
        // 2. 但是他的参数必须是数组(伪数组)
        // 3. apply 的主要应用 比如说我们可以利用 apply 借助于数学内置对象求数组最大值 
        // Math.max();
        var arr = [1, 66, 3, 99, 4];
        var arr1 = ['red', 'pink'];
        // var max = Math.max.apply(null, arr); 在这里我们不让this指向null,而是指向Math
        var max = Math.max.apply(Math, arr);
        var min = Math.min.apply(Math, arr);
        console.log(max, min); // 输出结果为 :99 1

tips: call() 和apply()都是改变完this指向后,并且会把这个函数给调用,但是我们一般都是改变this指向不调用这个函数,所以我们使用bind()改变this指向多一点。

不断复盘,不断优秀,让自己成为镜子里想成为的那个人.关注三连,持续更新~~~

在这里插入图片描述

### JavaScript改变 `this` 指向三种方法JavaScript 中,可以通过 `call()`、`apply()` 和 `bind()` 方法改变函数内部的 `this` 指向。以下是这三种方法的具体介绍: #### 1. 使用 `call()` 方法 `call()` 方法用于调用一个已有的函数,并指定该函数内的 `this` 值以及传递给它的参数。其基本语法如下: ```javascript function.call(thisArg, arg1, arg2, ...) ``` 其中,`thisArg` 表示函数运行时作为 `this` 的对象,后续参数则是依次传递给目标函数的实际参数。 例如: ```javascript const obj = { name: 'Alice' }; function greet(message) { console.log(`${message}, my name is ${this.name}`); } greet.call(obj, 'Hello'); // 输出: Hello, my name is Alice ``` 这种方法不仅能够改变 `this` 指向,还支持立即执行函数并传入多个独立参数[^1]。 --- #### 2. 使用 `apply()` 方法 `apply()` 方法的功能与 `call()` 类似,但它接受的是一个数组(或类数组结构),用来表示传递给目标函数的参数集合。其基本语法如下: ```javascript function.apply(thisArg, [argsArray]) ``` 这里 `[argsArray]` 是一个包含所有实际参数的数组。 例如: ```javascript const numbers = [50, 60, 70]; console.log(Math.max.apply(null, numbers)); // 输出: 70 ``` 通过这种方式,可以方便地将一组数据一次性传递给某个函数处理[^4]。 需要注意的是,在某些情况下,比如求数组的最大值或者最小值时,使用 `apply()` 可以简化代码逻辑[^2]。 --- #### 3. 使用 `bind()` 方法 不同于前两者会直接触发函数执行的行为模式,`bind()` 返回了一个新的绑定了特定上下文环境(`this`)的新函数实例。这意味着即使创建出了这样的闭包形式也不会马上启动原定义流程直到被显式调用为止。它的一般写法为: ```javascript function.bind(thisArg[, arg1[, arg2[, ...]]]) ``` 下面是一个简单的例子展示如何利用此特性实现延迟计算效果的同时调整好作用域关系。 ```javascript function logName() { console.log('My Name Is:' + this.firstName); } var personA = { firstName:"John"}; var boundLogPersonA=logName.bind(personA); boundLogPersonA();// My Name Is: John setTimeout(boundLogPersonA ,100); // Still prints "My Name Is: John" ``` 值得注意的地方在于虽然同样能完成更改当前实例指针的任务但却不具备即时运算能力而是生成另一个副本供以后单独启用[^3]. --- ### 总结对比表 | Call vs Apply vs Bind | 特性 | **Call** | **Apply** | **Bind** | |-----------------|----------------------------------|---------------------------------|----------------------------------| | 是否立即执行 | ✔ | ✔ | ✘ (仅返回新函数) | | 参数传递方式 | 单独列出 | 数组形式 | 单独列出 / 部分应用 | | 主要用途 | 调用函数 & 修改 this | 批量操作数组 | 创建预设 this 的新函数 | 以上就是有关于 JavaScript 当中的三个重要工具——即 call(), apply() 还有 bind()- 它们各自的特点及应用场景概述[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值