5.1函数中this的指向
函数正常调用时,this指向window
var name="张三"function show(){console.log(this.name)}function go(){var name="李四"console.log(this.name)}go();// 张三 window.go();
5.2改变函数内部关键字的指向
如何改变this关键字的指向 call, apply, bind
5.2.1 call 改变函数内部this关键字指向 funName.call(obj)
call,apply调用的时候马上执行
var name="王五";var obj={name:"李四"}function go(){console.log(this.name)}go();//王五go.call(obj);//李四
5.2.2apply funName.apply(obj)
var name="王五";var obj={name:"李四"}function go(){console.log(this.name)}go();//王五go.apply(obj);//李四
5.2.3 bind
bind** 绑定的函数不会马上执行,只是改变了函数上下文的执行环境**
var name="window"var meng={name:"孟"}var show=function(a,b){console.log(this.name);//孟console.log(a+b);//5}.bind(meng);show(2,3);
应用场景
<button id="btn">按钮</button><script>var id="1000";var btn=document.getElementById("btn")btn.onclick=function(){console.log(this.id)//btn}
<button id="btn">按钮</button><script>var id="1000";var btn=document.getElementById("btn")btn.onclick=function(){window.setTimeout(function(){console.log(this.id)//1000},1000)}
使用bind
var id="1000";var btn=document.getElementById("btn")btn.onclick=function(){window.setTimeout(function(){console.log(this.id)//btn}.bind(btn),1000)}var id="1000";var btn=document.getElementById("btn")btn.onclick=function(){var self=this;window.setTimeout(function(){console.log(this.id)//btn}.bind(self),1000)}
使用定时器
var id="1000";var btn=document.getElementById("btn")btn.onclick=function(){setTimeout(()=>{console.log(this.id)//btn},1000)}
call 和apply的区别
应用场景:传递多个参数的情况
call依次去传递
apply 需要传递数组
var name="window"var meng={name:"孟"}function show(a,b){console.log(this.name);console.log(a+b)}show(1,2)show.call(meng,2,3);show.apply(meng,[2,3])
