在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
&spm=1001.2101.3001.5002&articleId=148119203&d=1&t=3&u=7fb0d6211edf45c385fbb0e130d15cfc)
2836

被折叠的 条评论
为什么被折叠?



