一、根据函数调用方式的不同,就会指向不同的对象:
以函数的形式调用时,this就永远指向window
var name="zhang"
function show(){
console.log(this.name)
}
// 函数正常调用的时候 this指向window
function go(){
var name="lisi"
show()
}
go() //window.go()
以方法的形式调用时,this就是调用方法的那个对象
function fun(){
console.log(this.name)
}
var obj={
name:"xuan",
sayName:fun
}
obj.sayName() // xuan
二、改变函数中this指向
2-1、call
var name="王五"
var obj = { name:"瑄瑄" }
function go(){
console.log(this.name);
}
go() // 王五
go.call(obj) // 瑄瑄
2-2、apply
var names = "wangwu"
var obj = {
name: "xuanxuan"
}
function nam() {
console.log(this.name)
}
// apply 可以改变函数内部关键字的指向 funName.apply(obj)
nam.apply(obj)
2-3、bind
bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境
var name = "window"
var obj = {
name: "xuan"
}
var show=function go(a, b) {
console.log(this.name)
console.log(a + b)
}.bind(obj) //bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境
// call apply 调用的时候马上执行
show(5,6)
使用场景
<button id="btn">按钮</button>
<script>
var id="1001";
var btn = document.getElementById("btn")
btn.onclick = function(){
setTimeout(function(){ // window.setTimeout
console.log(this.id); // 1001
},1000)
}
</script>
## 解决
# 1.使用bind解决
btn.onclick = function(){
setTimeout(function(){
console.log(this.id);
}.bind(btn),1000)
}
/* btn.onclick = function(){
var self = this
setTimeout(function(){
console.log(this.id);
}.bind(self),1000)
}
btn.onclick = function(){
setTimeout(function(){
console.log(this.id);
}.bind(this),1000)
}
*/
# 2.使用箭头函数解决
btn.onclick = function(){
setTimeout(()=>{
console.log(this.id);
},1000)
}
三、call和apply的区别
- c**all:依次传递**
apply:需要传递数组
var name="window"
var obj={
name:"xuan"
}
function go(a,b){
console.log(this.name)
console.log(a+b)
}
// go(5,6)
// 传递多个参数
// call:依次传递
// apply:需要传递数组
go.call(obj,5,6) // xuan 11
go.apply(obj,[5,6])