this默认绑定规则:全局环境与函数内部表现

作者:技术拾光时间:2026-07-27 08:26:04浏览:106

在JavaScript中,函数以独立方式调用时触发默认绑定,全局环境下this指向全局对象(浏览器为window,Node.js为exports),普通函数内部非严格模式指向全局对象,严格模式为undefined,嵌套函数独立调用同样适用,赋值、回调等场景会丢失隐式绑定。

要说 JavaScript 里的 this,最基础也最容易让人困惑的,就是默认绑定。简单来说,当函数以“独立调用”的方式运行——既不是作为对象的方法,也没用 call / apply / bind 硬绑定,更没走 new——那么它的 this 就按默认规则来判定。

this默认绑定规则:全局环境与函数内部表现

全局环境下的默认绑定

先看全局环境。在最外层、没有被任何函数包裹的地方直接写 this,它指向的就是全局对象:浏览器里是 window。验证一下——console.log(this === window) 会返回 true。但在 Node.js 环境下,就不再是 window,而是当前模块的 exports 对象,通常是一个空对象 {}。还有一个细节值得注意:如果在全局作用域中用 var a = 1 声明变量,它会自动成为全局对象的属性,因此可以通过 this.a 获取到。

普通函数内部的默认绑定

再看函数内部。当一个函数被直接调用,比如 foo(),它里面的 this 同样遵循默认绑定规则。关键区别在于严格模式:非严格模式下,this 指向全局对象(浏览器里是 window);一旦加了 "use strict",this 就变成 undefined,不会再自动回退到 window。另外,嵌套函数和回调函数如果也是独立调用的,照样触发默认绑定——哪怕外层函数的 this 已经通过其他方式绑定了,内层函数该是 undefined 还是 undefined,该是全局还是全局。

容易踩坑的典型场景

以下是一些常见的“陷阱”,表面上看像是在对象上调用的,实际上隐式绑定已经丢失,退回了默认绑定:

  • 把方法赋值给一个变量再调用:const fn = obj.method; fn();——这时候 this 已经不是 obj 了。
  • 作为回调传入定时器或事件监听:setTimeout(obj.method, 100)——方法被独立调用,上下文丢失。
  • 解构赋值后调用:const { method } = obj; method();——同样,上下文丢失。

一句话总结:默认绑定不关心函数在哪里定义,只看它怎么被调用。只要没有显式指定、没有被对象“点”着调用、没有被 new 或箭头函数特殊处理,这条规则就生效。