this绑定与强制类型转换(Coercion)

在JavaScript里,this是一个特殊的关键字,它的值会依据函数的调用方式动态改变。

可以把this想象成函数执行时的”上下文指针“,它指向的是调用当前函数的那个对象。

下面结合具体场景,解释this的绑定机制:
1.默认绑定(全局作用域)

当函数独立调用,没有明确的调用者时,this默认指向全局对象(在浏览器环境中是window)。严格模式下,this为undefined

function sayHello(){
    console.log(this);//浏览器中指向window
}

sayHello();//独立调用,this指向全局对象

2.隐式绑定(作为对象方法)

当函数作为对象的方法被调用时,this指向调用该方法的对象

const person = {
    name: "Alice",
    greet(){
        console.log(`Hello,${this.name}`);
    }
};

person.greet();//输出"Hello Alice"

3.显示绑定(call、apply、bind)

通过call()、apply()或bind()方法,可以强制指定this的值

function greet(message){
    console.log(`${message},${this.name}`);
}

const person = { name: "Bob"};

//使用call显示绑定this
greet.call(person,"Hi"); //输出"Hi,Bob"

//使用bind创建一个新函数,永久绑定this
const greetBob = greet.bind(person);
greetBob("Hello");//输出:"Hello,Bob"

4. 构造函数绑定(new关键字)

使用new调用函数时,this指向新创建的对象

function Person(name){
    this.name = name;//this指向新创建的实例
}

const alice = new Person("Alice");
console.log(alice.name);//输出"Alice"

5.箭头函数的特殊绑定

箭头函数不绑定自己的this,而是继承自外层函数(词法作用域)。

const person = {
    name: "Charlie",
    greet: function(){
        //箭头函数继承自greet方法的this
        setTimeout(() =>{
            console.log(`Hello,${this.name}`); //this指向person
        },1000);
    }
};

person.greet();//输出:"Hello,Charlie"

总结:

①默认绑定:没人认领的函数,this指向全局(或严格模式下的undefined)。

②隐式绑定:谁调用我,this就是谁(比如对象的方法)。

③显示绑定:用call/apply

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值