关于JS中的this指向问题

    技术2026-03-02  9

    JS中的this指向估计是不少人头疼的问题,以为简单,但是经常遇到this的时候又被搞的昏头转向,今天通过几个简单的例子来梳理一下,最后再做个总结,让你不再为this烦恼。

    首先很多人都知道this和定义在哪里无关,取决于在哪里调用,所以下面这行代码不能判断this到底指代谁 function foo(){ console.log(this)//this指向不确定,取决于调用 } 而调用的情况分好几种,我们要判断出this是如何调用的。 下面的函数foo定义在对象obj1中,不要理所当然的认为调用时就指向obj1,它不只会以方法(作为对象中属性)的形式调用,也可以以函数的形式调用,此时this就指向全局对象 const obj1 = { foo:function(){ console.log(this) } } obj1.foo()//this指向obj1对象 const f = obj.foo f()//作为函数调用,this指向全局对象

    注意:代码的执行要看运行环境,如果是在严格模式下,是没有指向全局的this的,此时this就是undefined。在node和浏览器中,全局对象也不同。

    接下来我们再看一个稍微迷惑一点的情况,bar函数定义在foo函数中,foo函数调用时,bar函数自调用,这时的this又指向谁? const obj2 = { foo:function(){ function bar(){ console.log(this) } bar() } } obj2.foo()//bar函数直接调用,this指向全局对象

    我们经常被复杂一点的代码扰乱了自己的判断,其实不用看别的,只关心函数的调用就行。虽然在foo函数里面,但是bar函数还是作为函数直接调用的,所以this还是指向全局。

    把上面的例子再改动一下,bar函数的定义换成箭头函数。我们知道箭头函数没有自己的作用域,也就是说箭头函数内外的作用域是一致的,此时bar函数的this与外层的foo函数一致,自然指向调用foo函数的obj3。 const obj3 = { foo:function(){ const bar = () => { console.log(this) } bar() } } obj3.foo()//this指向obj3对象

    关于this的总结: 如果对this的指向还是会混淆,没事,通过下面的总结,靠死记也能把this的判断规则给记下来

    沿着作用域向上找到最近的一个function(箭头函数不算,往上接着找有作用域的function),看这个function最终是怎么执行的

    this的执行取决于所属的function的调用方式,而不是看定义

    function的调用一般有以下几种

    a.作为函数调用,即:foo() ​ i.执行全局对象,注意严格模式问题 b.作为方法调用,即foo.bar() ​ i.执行最终调用这个方法的对象 c.作为构造函数调用,即:new Foo() ​ i.指向一个新对象Foo {} d.特殊调用,即foo.call()/foo.apply() i.参数指定成员
    Processed: 0.017, SQL: 9