1.函数作为普通函数调用,this指向window
var name="张三";
function show(){
console.log(this.name);
}
function go(){
var name="李四";
show();
}
go();
//window.go()
2.改变this关键字指向方法:call,apply,bind
(1)ccll方法
var name="张三";
var obj={
name:"李四"
}
function go(){
console.log(this.name);
}
go();// 输出张三
go.call(obj);//李四
(2)apply方法
var name="张三";
var obj={
name:"李四"
}
function go(){
console.log(this.name);
}
go();// 输出张三
go.apply(obj);//李四
(3)bind方法
bind绑定的函数不会马上执行,只是改变了函数上下文的执行环境<br /> call ,applay调用的时候会马上执行
var name="window"
var zhang={
name:"李四"
}
var show=function(a,b){
console.log(this.name);
console.log(a+b);
}.bind(zhang);
show(2,3);
(4)Call和apply之间的区别
如果要传递参数,apply跟数组
var name="window"
var zhang={
name:"李四"
}
function show(a,b){
console.log(this.name);
console.log(a+b);
}
show(1,2) // 输出window 3
show.call(zhang,2,3) //输出 李四 5
show.apply(zhang,[1,2]) //输出 李四 3
3.使用场景 解决定时器在事件中的指向问题
<button id="btn">按钮</button>
<script>
var id="1001"
var btn=document.getElementById("btn");
btn.onclick=function(){
// console.log(this.id);
window.setTimeout(function(){
console.log(this.id);//输出1001
},1000)
}
</script>
//输出1001
解决方法:
(1)bind
<button id="btn">按钮</button>
<script>
var id="1001"
var btn=document.getElementById("btn");
btn.onclick=function(){
// console.log(this.id);
window.setTimeout(function(){
console.log(this.id);
}.bind(this),1000)
}
</script>
//输出btn
(2)self方法
<button id="btn">按钮</button>
<script>
var id = "1001"
var btn = document.getElementById("btn");
btn.onclick = function(){
var self = this; //增进语义化
setTimeout(function(){
console.log(this.id)
}.bind(self), 1000) //bind方法改变上下文执行环境
}
</script>
(3)使用箭头函数
<button id="btn">按钮</button>
<script>
var id="1001"
var btn=document.getElementById("btn");
btn.onclick=function(){
setTimeout(()=>{
console.log(this.id);
},1000)
}
</script>
//输出btn