一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

通过默认绑定原理解析立即执行函数 IIFE 内部 this 永远指向全局的奥秘

时间:2026-07-01 11:18:52 编辑:袖梨 来源:一聚教程网

在非严格模式下,IIFE中的this指向全局对象,根本原因是函数独立调用时触发默认绑定规则;严格模式下则为undefined;外层括号仅为分组操作符,不创建上下文;可通过call/apply/bind或箭头函数等方式手动干预。

在非严格模式下,IIFE 中的 this 指向全局对象(如浏览器中的 window),根本原因在于函数调用时的默认绑定规则——当函数独立调用、没有明确上下文时,this 自动绑定到全局对象。这和 IIFE 的“立即执行”形式无关,而是 JavaScript 执行上下文建立时的底层机制。

默认绑定:谁调用,this 就是谁?不,是“没人显式指定时”的兜底规则

默认绑定发生在函数以“简单调用”形式出现时,即:
– 不是作为对象方法(obj.fn()
– 不是通过 call/apply/bind 显式绑定
– 不是作为构造函数(new fn()
– 也不是箭头函数(它不绑定 this,而是继承外层)

此时,JavaScript 引擎会把 this 设为全局对象(非严格模式)或 undefined(严格模式)。

IIFE 写成这样:

(() => { console.log(this); })();

虽然它被包裹在括号里,但执行时仍是“直接调用”——没有点号、没有 call、没有 new。所以触发默认绑定。

为什么 IIFE 看似“有主语”,其实没有?

有人误以为 (function(){...})() 中的括号“属于”函数自身,从而产生上下文。但语法上,外层括号只是**分组操作符**,用于消除函数声明与调用之间的歧义,并不创建调用上下文。

等价于:

const f = function(){ console.log(this); };
f(); // 同样是默认绑定

只是 IIFE 把定义和调用压缩在一行,本质未变。

严格模式下 this 是 undefined,不是 bug,是默认绑定的另一面

开启严格模式后,默认绑定不再兜底到全局对象:

(function(){ "use strict"; console.log(this); })(); // undefined

这反而印证了原理:默认绑定是一条明确规则,而非“总是指向 window”。它的行为由是否处于严格模式决定。

想让 IIFE 里的 this 指向其他对象?可以,但得手动干预

默认绑定可被更高优先级的绑定方式覆盖:

  • call/apply/bind(function(){ console.log(this); }).call({x:1}); → 输出 {x:1}
  • 箭头函数:它不绑定 this,而是沿作用域链查找外层的 this(可能来自外层普通函数)
  • 作为对象方法调用:不是 IIFE 常见写法,但技术上可行 —— obj = { f: function(){ console.log(this); } }; obj.f();

注意:这些都不是“IIFE 自身改变了 this”,而是你绕过了默认绑定。

热门栏目