inJSjs中的this点非常灵活,有句话叫“谁调用this就指向谁”1.this的规律1.在函数体中,在严格模式下,this指向undefined。在非严格模式下,它指向全局对象window2。用new方法调用函数,构造函数中的this会绑定到新创建的对象上。3.用call、apply、bind方法调用函数时,函数体中的this会绑定到指定的参数对象上4.对象调用函数时,函数中的this会绑定到对象上5.在箭头函数,this指向外部(函数或全局)作用域2,call,apply,bind,new1。一般叫call,apply,bindthis绑定是显式绑定,调用关系决定了this指向什么叫隐式绑定2.call,apply直接调用函数,函数体中的this指向参数对象,bind返回新建一个函数,函数体中的this指向参数中的对象,需要手动调用3.call、apply、bind的优先级高于正常。下面的例子是一个对象调用函数,它的this指向被调用的、Apply、bind修改的例子:functionf1(a){console.log(this.a);}constobj1={a:1,f1:f1}constobj2={a:2,f1:f1}constobj3={a:3,f1:f1}obj1.f1.call(obj2)//2obj2。f1.call(obj1)//1obj2.f1.bind(obj1)()//14.new优先于bindhighfunctionf1(a){this.a=a}constobj1={}varfun=f1.bind(obj1)fun(2)console.log(obj1.a);//2varobj2=newfun(3)console.log(obj2.a);//3从结果可以看出,bind返回的是一个指向this指向obj1的函数fun,当fun函数用作构造函数时修改this点,指向新创建的对象obj23.箭头函数的this点先看一段代码,输出应该是什么constobj={a:1}varb=()=>{console.log(this.a);}b.call(obj)这里输出undefined,因为箭头函数的this指向外层作用域,函数或者全局函数fun(){returna=>{console.log(this.a);}}constobj1={a:1}constobj2={a:2}varfuc=fun.call(obj1)fuc.call(obj2)输出结果为1为什么,据我理解:当调用fun第一次,thisinfun指向obj1。此时箭头函数的外层作用域就是fun函数,所以箭头函数的this指向fun函数中的this,也就是obj1,然后返回箭头函数。fuc.call(obj2)调用这个fuc函数时,将函数体的this指向obj2,第一个例子说明此时的箭头函数不会指向obj2,而是会指向global。但是这个箭头函数的this已经指向了obj1,箭头函数的this指向是不能修改的,所以this不会指向全局。另一个例子:varfun=()=>a=>{console.log(this.a);}constobj1={a:1}constobj2={a:2}varfuc=fun.call(obj1)fuc.call(obj2)这次箭头函数返回一个箭头函数,输出会是什么?undefined,如第一个例子所示,即使fun函数使用call将函数体中的this指针改为obj1,它仍然会去外层作用域获取this指针,这里外层作用域是全局的,并且fuc接收到fun函数返回arrow函数,把函数体中的this点改成obj2,结果一样,去外作用域全局获取this点
