改变函数中的this指向

文章详细介绍了JavaScript中用于改变函数体内this指向的方法:bind、call和apply。bind方法不调用函数但能改变this,返回的新函数可在之后使用;call和apply都可立即调用函数并改变this,apply以数组方式传递参数,call则直接传参。三者都能改变this,但调用时机和参数传递方式有所不同。
摘要由CSDN通过智能技术生成

1. bind 方法

(1)不调用函数,可以改变 this 指向

(2)fun.apply(thisArg,arg1,arg2...)

(3)thisArg:在fun运行时指向的this值

(4)arg1,arg2:传递的其它参数

// bind()方法不调用函数,但是可以改变this指向
const obj = {
    uname: 'ansk'
}
function fn() {
    console.log(this);
}
// 1. bind()方法不调用函数
// 2. 能够改变this指向
// 3. 返回值是个函数,这个函数里面的this指向是更改过的
const fun = fn.bind(obj);
// console.log(fun);
fun(); // {uname: 'ansk'}
// 按钮点击之后立马禁用,两秒钟之后开启
// const btn = document.querySelector('button');
// btn.addEventListener('click', function() {
//     this.disabled = true; // 禁用按钮
//     window.setTimeout(() => {
//         this.disabled = false;
//     }, 2000);
// });
const btn = document.querySelector('button');
btn.addEventListener('click', function() {
    this.disabled = true; // 禁用按钮
    window.setTimeout(function() {
        // 在这个普通函数里面,要this从window改为btn
        this.disabled = false;
    }.bind(this), 2000); // }.bind(btn), 2000); bind不会立刻调用函数,会改变this指向
});

2. call 方法

(1)可以调用函数;

(2)可以改变函数内的this指向;

const obj = {
    uname: 'ansk'
}
function fn (x, y) {
    console.log(this);
    console.log(x + y);
}
// 1. 调用函数
// 2. 改变this指向
fn.call(obj, 1, 2); // 让 fn 里面的this指向 obj

3. apply 方法

(1)可以调用函数

(2)可以改变 this 指向

(3)fun.apply(thisArg,[argsArray])

(4)thisArg:在fun运行时指向的this值

(5)argsArray:传递的值,必须包含在数组里面 返回值就是函数的返回值,因为它就是调用函数

const obj = {
    uname: 'ansk'
}
function fn(x, y) {
    console.log(this);
    console.log(x + y);
    
}
// 1. 调用函数
// 2. 改变this指向 fn.apply(this指向, 参数)
fn.apply(obj, [1, 2]);
// 3. 返回值 本身在调用函数 ,所以返回值就是原来函数的返回值
// 4. 使用场景:求数组最大值
// const max = Math.max(1,2,3);
// console.log(max);
const arr = [100, 44, -9];
const max = Math.max.apply(null, arr);
const min = Math.min.apply(null, arr);
console.log(max, min);
// 扩展运算符求最大值
console.log(Math.max(...arr)); // 100

4. 三种方法的相同点以及不同点

(1)相同点:

都可以改变函数内部的 this 指向

(2)不同点:

apply【apply(obj, [1, 2, 3])】 和 call【call(obj, 1, 2, 3)】 方法都会调用函数,并且改变函数内部的this指向;bind 方法不会调用函数

apply参数以数组的方式传递,而 call 不是。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值