this 的应用场景
1. 作为普通方法被调用(谁调用次方方法this指向谁直接调用者)
function fn(){
console.log(this);
}
fn(); //window
2. 使用call apply bind 被调用(用来改变this的和传值)
const obj1 ={
x:1,
obj2:{
x:2,
fn:function(){
console.log(this);
console.log('arg',arguments);
}
}
}
obj1.obj2.fn.call(obj1,1,2,3);
obj1.obj2.fn.apply(obj1,[4,5,6]);
obj1.obj2.fn.bind(obj1,7,8,9)();
\
3. 作为对象方法被调用
const obj1 ={
x:1,
obj2:{
x:2,
fn:function(){
console.log(this);
console.log('arg',arguments);
}
}
}
obj1.obj2.fn()
4. 构成函数中调用,返回的是当前实例对象
function Person(){
this.name ='张三'
return this; // 没有写的时候自动默认返回
}
console.log(new Person().name) // 张三 构造函数就是用来创建新对象的所以返回这个对象
5.在class 中被调用(es6 新增的)
class Person {
constructor(){
this.sex ='man' //这个值可以初始化
}
say(){
console.log('sayName',this.name)// this 指向当实例化的新对象
}
}
console.log('name',new Person().name);
console.log('person',new Person());
new Person().say()
5. 箭头函数中被调用(此时的call apply bind只是用来传值 此函数没有arguments)
const obj ={
x:1,
obj2:{
x:2,
fn:(...rest)=>{
console.log(this,rest);
}
}
}
obj.obj2.fn.call(obj,1,2,3);
obj.obj2.fn.apply(obj,[4,5,6]);
obj.obj2.fn.bind(obj,7,8,9)();
6 总结
this 的指向是在执行的时候决定的不是在定义时觉得的即:谁调用指向谁,除了构造函数和箭头函数,构造函数的this指向实例,箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值。任何方法都改变不了其指向call apply bind 只是个传值