/* 1、使用箭头函数,可以解决this关键字指向问题 */ var id = 1001 var btn = document.getElementById("btn") btn.onclick = function(){ // console.log(this.id);//btn setTimeout(()=>{ //如果这里使用的是箭头函数,那么它自身是没有this指向的,就会向外去 找,就找到btn这个事件函数的this console.log(this.id);//1001 },1000) }
var id = 1001var btn = document.getElementById("btn")var show = ()=>{ console.log(this.id);//1001}btn.onclick = function(){ /* 在函数内部调用一个普通函数,this指向window */ go()//1001 show()//1001}function go(){ console.log(this.id);}
bind
1、onclick2、在对象的方法中,谁调用方法,this就指向谁3、函数直接调用的时候,this指向windowvar name = 'window'var obj = { name:'obj', sayName:function(){ console.log(this.name); }}var show = function(){ console.log(this.name);}.bind(obj)show()//obj使用bind方法,可以改变函数运行的上下文环境,bind中的参数传入谁,this就指向谁
call、aplly
bind,call,aplly的区别1、call,apply是调用的时候执行2、bind仅仅只改变了函数上下文的运行环境,不会马上执行var name = 'window'var obj = { name:'obj', sayName:function(){ console.log(this.name); }}function go(){ console.log(this.name);}go()// call与apply也可以改变函数内部this关键字的指向go.call(obj)//objgo.apply(obj)//obj
call和aplly的区别var name = 'window'var obj = { name:'obj'}/* 函数存在多个参数的情况,call按顺序传参,apply必须传数组 */function go(a,b){ console.log(this.name); console.log(a+b);}// go(2,3)// go.call(obj,2,3)go.apply(obj,[2,3])
