javascript中的this指向有什么规则_如何在各种场景下确定this值【教程】

11次阅读

普通函数直接调用时,非严格模式this指向全局对象浏览器window/node.js global),严格模式下为undefined;对象方法调用时this指向点号左侧对象;call/apply/bind可显式绑定this;箭头函数无this,继承外层词法作用域this。

javascript中的this指向有什么规则_如何在各种场景下确定this值【教程】

普通函数调用时的 this 指向

直接执行一个函数(比如 foo()),this 在非严格模式下指向全局对象(浏览器中是 window,Node.js 中是 global);严格模式下为 undefined

  • 容易踩的坑:在事件回调或定时器里直接传入普通函数,this 会丢失绑定,比如 setTimeout(obj.method, 100) 中的 method 内部 this 不再是 obj
  • 验证方式:在函数开头加 console.log(this),观察输出值
  • 注意箭头函数不适用此规则——它没有自己的 this,而是继承外层作用域this

对象方法调用时的 this 绑定

当函数作为对象属性被调用(obj.method()),this 指向该对象(即点号左边的对象)。

  • 只看调用时的「点左边是谁」,和函数定义在哪无关。例如把 obj.method 赋给变量后再调用:const fn = obj.method; fn() → 此时已退化为普通调用,this 不再是 obj
  • 嵌套对象也一样:obj.inner.nested() 中的 thisobj.inner,不是 obj
  • getter/setter 中的 this 同样遵循该规则,指向触发 getter 的那个对象

callapplybind 如何显式控制 this

这三个方法都用于手动指定函数运行时的 this 值。

  • func.call(obj, arg1, arg2):立即执行,this 设为 obj
  • func.apply(obj, [arg1, arg2]):同上,参数以数组形式传入
  • func.bind(obj):返回一个新函数,该函数永久绑定 thisobj,即使后续再用 call 也无法覆盖(除非用 new
  • 注意:bind 两次不会叠加,第二次绑定无效;new 调用绑定函数时,this 会被新实例覆盖,忽略原绑定

箭头函数与 this 的特殊性

箭头函数不绑定 this,它直接沿用定义时所在词法作用域的 this 值,且无法通过 call/apply/bind 修改。

立即学习Java免费学习笔记(深入)”;

  • 常见误用:在对象方法中写箭头函数想访问对象属性,结果 this 指向外层(比如构造函数或模块顶层),导致 this.xxxundefined
  • 适合场景:回调函数中需要保持外层 this,如 arr.map(x => this.handle(x)),避免手动 bind 或缓存 const self = this
  • 不能用作构造函数:调用 new 箭头函数会报错 TypeError: xxx is not a constructor

实际项目中最容易出问题的,是异步回调、事件监听器、高阶函数传参这三类场景里的 this 隐式丢失。别依赖记忆规则,遇到不确定就加一行 console.log(this) 看一眼。

text=ZqhQzanResources