IIFE中的this指向取决于严格模式:非严格模式下为全局对象(浏览器中是window),严格模式下为undefined,与定义位置和嵌套层级无关。

自执行函数(IIFE)中的 this 指向,不取决于它写在哪、嵌套多深,只看它**怎么被调用**——而 IIFE 本质就是“直接调用”,所以走的是 JavaScript 的默认绑定规则。识别它的 this 指向,关键就看当前执行环境是否启用严格模式。
非严格模式下:this 总是全局对象
无论 IIFE 写在全局、对象方法里,还是另一个函数内部,只要没加 "use strict",它的 this 就指向运行时的全局对象:
- 浏览器中是
window(或现代标准下的globalThis) - Node.js 中是
globalThis(不是旧版global) - 即使嵌套在
obj.method()里,里面的(function(){ console.log(this); })()仍输出window
严格模式下:this 直接为 undefined
ES5 引入严格模式,就是为了禁掉“自动兜底到全局”的行为。只要任意一层作用域启用了严格模式,IIFE 中的 this 就不再装箱,而是保持原始值 undefined:
- 顶层加
"use strict"→ 所有 IIFE 的 this 是undefined - ES6 模块(
.mjs或<script type="module"></script>)默认严格模式 → 模块内 IIFE 的 this 必为undefined - 类(
class)内部所有方法也默认严格模式 → 类方法里写的 IIFE,this 同样是undefined
常见误判点:别被“定义位置”带偏
很多人以为“写在对象里,this 就该指向那个对象”,这是错的。IIFE 没有调用者对象,它不是 obj.fn() 这种形式,所以隐式绑定不生效:
-
obj.method = function() { (function(){ console.log(this); })(); }→ 输出window或undefined,不是obj -
const fn = obj.method; fn()之后再执行 IIFE,结果一样 —— 和obj无关 - 箭头函数没有自己的 this,但 IIFE 是普通函数,它有自己的执行上下文,必须按默认规则判断
快速识别口诀
看到 IIFE,三步确认:
- 查有没有
"use strict"(包括外层模块或类)→ 有则 this === undefined - 没严格模式 → 看运行环境 → 浏览器是
window,Node 是globalThis - 忽略函数在哪定义、嵌套几层、外层 this 是啥 —— 只盯住
(function(){})()这一行的调用形式

















