当前位置: 首页 > Web前端 > JavaScript

[js]5种this绑定浅析

时间:2023-03-27 00:27:26 JavaScript

this绑定/this指向默认绑定-窗口隐式绑定-上下文显示绑定-调用、应用、绑定新绑定-新对象箭头函数绑定-上层作用域1.默认绑定函数fn1(){leta=1;letfn2=function(){console.log(this);控制台日志(this.a);}fn2();returnfn2}vara=2;fn1()//window2fn1()()//window2window2无论是在哪里声明或调用函数,调用时函数前都没有对象,this最终会指向到窗口2。隐式绑定函数fn(){console.log(this.name);}letobj1={name:"boj1",fn}letobj2={name:"obj2",obj1}obj2.obj1.fn()//当obj1函数调用前有对象时,this指向最近的上下文对象。如果没有找到属性,返回undefined,不会在obj2参数传递变量赋值参数传递上发现隐式丢失letname="window"functionfn(){console.log(this.name);}letobj1={name:"obj1",fn}letobj2={name:"obj2",obj1}functionfunc(param){param()}func(obj2.obj1.fn)//windowfn在func中作为参数被调用,这点是丢失,默认是给window变量赋值letname="window"functionfn(){console.log(this.name);}letobj1={name:"obj1",fn}letobj2={name:"obj2",obj1}letfunc=obj2.obj1.fnfunc();//window将fn赋值给func,func的调用默认情况下使用它指向window3。显示绑定bindcallapplybindletname="window"functionfn(){console.log(this.name);}letobj1={name:"obj1",fn}letobj2={name:"obj2",obj1}functionfunc1(param){param()}func1(obj1.fn.bind(obj2))//obj2letfunc2=obj1.fn.bind(obj2)func2()//obj2binding:fn.bind(obj)将fn绑定到obj和return一个函数,不管是传参还是变量赋值,绑定都不会丢失。参数:bind的第一个参数为绑定对象,后面的参数可以加为函数实参传递数组时不会自动解构优先级:显式绑定>隐式绑定>默认绑定硬绑定:绑定后,您不能使用绑定、调用、应用然后重新绑定callletname="window"functionfn(){letname=this.namereturnfunctionfn1(){console.log(name,this.name);}}letobj1={name:"obj1",fn}letobj2={name:"obj2",obj1}functionfunc1(param){param()}func1(obj1.fn.call(obj2))//obj2windowletfunc2=obj1.fn.call(obj2)func2()//obj2windowfunc2.call(obj1)//obj2obj1绑定:调用绑定不同于bind返回一个绑定的函数,而是立即执行这个函数参数:同bind,this指向第一个参数,后面的参数都作为实参,array不自动解构闭包:绑定时只绑定最外层作用域,调用时默认绑定父函数返回的函数,当被绑定,它的this将被绑定而不影响外部范围scopeapplyletarr=["param1","param2"]letname="window"functionfn(...arr){console.log(this.name,arr[0],arr[1]);}letobj1={name:"obj1",fn}letobj2={name:"obj2",}obj1.fn.apply(obj2,arr)//obj2param1param2绑定:apply和call一样,绑定的函数会立即执行参数:first第一个参数也是一个绑定对象,和calllater不同,apply传递的数组会解构赋值给函数的形参4.newbindingfunctionfn(name){this.name=name}letobj=newfn("obj")console.log(obj.name);//objconsole.log(newfn("new"));//{name:new}使用new来调用函数,它将使用函数as一个构造函数,把这个函数的this指向一个新创建的对象,并返回这个对象5.箭头函数可以和例子中callletname="window"functionfn(){letname=this.namereturn()=>{console.log(name,this.name);}}letobj1={name:"obj1",}letobj2={name:"obj2",}letfunc2=fn.call(obj2)func2()//obj2obj2func2.call(obj1)//obj2obj2letfunc1=fn.call(obj1)func1()//obj1obj1箭头函数没有自己的this,会使用之前作用域的this绑定箭头函数没有作用,修改指向需要修改的上层作用域的this