JavaScript内部函数独立调用时按默认绑定:非严格模式下this指向全局对象(浏览器为window,Node为global),严格模式下为undefined;箭头函数不参与默认绑定,继承外层this。

JavaScript 内部函数调用时,this 的默认绑定不看它写在哪,只看它怎么被调用。如果这个内部函数是“独立调用”——也就是没通过对象点号、没用 call/apply/bind、也没用 new,那它就走默认绑定规则。
非严格模式下指向全局对象
在浏览器中,this 就是 window;在 Node.js 中,是 global。哪怕函数嵌套再深,只要调用形式是 fn(),就直接落到全局上。
- 全局变量可被 this 访问:比如
var a = 100后,在默认绑定的函数里写console.log(this.a)能输出100 - 定时器、自执行函数里的普通函数调用,也属于默认绑定,this 指向 window
- 事件监听器中传入的匿名函数若未显式绑定,单独调用时同样触发默认绑定
严格模式下 this 是 undefined
只要函数体顶部有 'use strict',或整个脚本启用严格模式,独立调用时 this 就是 undefined,任何对 this.xxx 的读写都会报错。
-
function foo() { 'use strict'; console.log(this); }→ 输出undefined - 此时
this.a = 1会抛出TypeError,避免意外污染全局 - 严格模式不会影响箭头函数,但箭头函数本身不参与默认绑定
容易被忽略的“伪隐式”陷阱
看似在对象方法里定义的内部函数,一旦被抽出来单独调用,就立刻退回到默认绑定——和外层 this 完全无关。
立即学习“Java免费学习笔记(深入)”;
-
const obj = { name: 'Alice', say() { function inner() { console.log(this); } inner(); } };→inner()是独立调用,不是obj.inner() - 回调传参也会丢失绑定:
setTimeout(obj.say, 100)中的say就变成默认绑定 - 解决办法:用
inner.bind(obj)、obj.say.bind(obj),或改用箭头函数(继承外层 this)
箭头函数是例外,不走默认绑定
箭头函数没有自己的 this,它直接沿作用域链向上找外层函数的 this 值,完全跳过四条绑定规则。
- 即使在严格模式下,箭头函数里的 this 也不会是 undefined
- 它在定义时就确定了 this 值,调用方式不影响它
- 常用于事件处理、定时器、Promise 回调等易失绑定的场景


















