最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
通过默认绑定原理解析立即执行函数 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”,而是你绕过了默认绑定。
相关文章
- 刀剑乱舞疲劳怎么办 疲劳度恢复攻略 07-01
- 不义联盟2史低价格是多少:不义联盟2历史最低价查询与购买建议 07-01
- 天堂2盟约骑士职业定位与进阶技巧天堂2盟约骑士玩法指南 07-01
- 采石场惊魂史低价攻略 采石场惊魂史最低价格查询与购买建议 07-01
- 息风谷战略仙竹海副本怎么玩 息风谷战略仙竹门副本通关技巧与阵容搭配 07-01
- 巴别塔圣歌史低价格是多少 巴别塔圣歌当前最低售价一览 07-01