2.9 KiB
2.9 KiB
this 指向
什么是 this
this 是执行期上下文中的一个属性,设计目的是在函数体内部指代函数当前的运行环境,以方便引用当前环境的其他变量
判断this指向的规则
谁(对象)调用 就指向谁 如果没在对象里面 this就指向全局window(全局对象) 如果在对象中,this指代的是当前对象实例, 箭头函数例外,他的函数内部没有this 在执行到this的时候会去找外部对象 所以 箭头函数的this最终就指向他外一层的对象 当他只有一层的时候 this会指向全局对象 window
思考下面的代码 会输出什么
var aaa=1;
var c=3
function fn(){
aaa=6
console.log(this.aaa)
}
var obj={
aaa:222,
fn:function(){
console.log(this.aaa)
}
fn1:()=>{
console.log(this.aaa)
}
}
fn()
obj.fn() //222
obj.fn1() //1
console.log(this.c) //this==> window
console.log(c) = console.log(window.c)
call 和 apply (改变this指向)
call
作用 :改变this的指向
语法: B.方法名.call(A,n,m...)
这个方法本来是B拥有的,方法中的this 指向的也是B
执行完这句call 之后, 方法中的this 指向A
所以说A用了这个方法
var cat={
name:"大喵",
run:function(){
console.log("我会跑")
},
eat(){
console.log("我在吃东西")
}
};
var dog={
name:"大汪",
bark(){
console.log("汪汪汪")
},
paqiang(){
console.log(this)
console.log("我能爬墙")
}
}
// 大喵需要借用大汪的paqiang的技能
dog.paqiang.call(cat)
dog.paqiang()
//让别人用自己的技能
dog.paqiang.call(cat)
paqiang 是dog有的技能
this指向也变成猫了
apply
apply 的作用和call 是完全一样的都是改变this的指向 语法: B.方法名.apply(A,[n,m...]) 这个方法本来是B拥有的,方法中的this 指向的也是B 执行完这句apply 之后, 方法中的this 指向A 所以说A用了这个方法 上面的问题也可以用下面的方式解决:
var cat={
name:"大喵",
run:function(){
console.log("我会跑")
},
eat(){
console.log("我在吃东西")
}
};
var dog={
name:"大汪",
bark(){
console.log("汪汪汪")
},
paqiang(m,n){
console.log(this)
console.log(m,n,"我能爬墙")
}
}
// 大喵需要借用大汪的paqiang的技能
// dog.paqiang.call(cat,1,2) 这是call实现的
dog.paqiang.apply(cat,[1,2]) //这是用apply实现的
dog.paqiang()