this默认绑定规则:全局环境与函数内部表现
在JavaScript中,函数以独立方式调用时触发默认绑定,全局环境下this指向全局对象(浏览器为window,Node.js为exports),普通函数内部非严格模式指向全局对象,严格模式为undefined,嵌套函数独立调用同样适用,赋值、回调等场景会丢失隐式绑定。
要说 JavaScript 里的 this,最基础也最容易让人困惑的,就是默认绑定。简单来说,当函数以“独立调用”的方式运行——既不是作为对象的方法,也没用 call / apply / bind 硬绑定,更没走 new——那么它的 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 或箭头函数特殊处理,这条规则就生效。
