this和caller的区别中失去了this。这代表函数的调用者。谁调用函数。这是来电者代表的人。就是函数的执行环境,函数在哪个作用域。在执行过程中,调用者是谁,注意区分:调用者和执行环境不是一回事constobj={a:function(){控制台日志(这个);console.log(obj.a.caller)}}functionb(){obj.a()}b()方法a在函数B中执行,所以调用者返回函数B但是方法a是通过obj调用的,所以这个返回obj并将其替换为回调方法a:constobj={a:function(){console.log(this);console.log(obj.a.caller)}}functionb(cb){cb()}b(obj.a)methoda,仍然在函数B中执行,所以调用者仍然返回函数B但是此时方法a不是直接通过obj调用,而是通过obj.a找到函数a,将函数a赋值给函数b的参数cb,然后执行cb(),也就是所谓的回调函数。此时方法a直接作为回调执行,没有被调用者,js会使用顶层对象作为调用者,所以this指向window。因此,函数只要在一定范围内执行,它的执行环境就永远不会改变,但它的调用者会根据调用方式随时改变。这是丢失了。前面说了,不同的调用方式,函数的调用者,也就是this,是会随时变化的。这就是为什么this在js中会丢失的原因。constobj={name:'hh',a:function(){console.log(this)}}obj.a()通过obj对象调用a方法,a方法的调用者是obj对象,所以a方法中的this就是obj对象constobj={name:'hh',a:function(){console.log(this)}}constb=obj.ab()constb=obj.a是为了将obj中的函数a赋值给变量b。此时变量b的值在obj.a中,此时b()直接执行,没有任何调用者。函数中的this会按照JS的规则指向顶级对象窗口。如果使用[strictmode],this将不再指向window,而是undefined"usestrict";constobj={name:'hh',a:function(){console.log(this)}}constb=obj.ab()This在reactclassAppextendsComponent{handle=function(){console.日志(这个);}render(){return(<>
