默认绑定下,非严格模式this指向全局对象,严格模式下为undefined;箭头函数不受影响,其this由外层词法作用域决定。

在JavaScript中,this 的默认绑定规则很简单:当函数以普通方式调用(即不通过对象属性、call/apply/bind、new 或箭头函数等方式显式绑定)时,this 指向全局对象;但在严格模式下,它会是 undefined。
普通函数调用下的默认绑定
这是最基础也最容易被忽略的场景。只要一个函数不是作为对象方法、构造函数或通过显式绑定方式调用,就属于“默认绑定”。
- 非严格模式下:
this指向全局对象(浏览器中是window,Node.js 中是global) - 严格模式下:
this是undefined,任何对this的属性访问都会报错(如this.a = 1)
例如:
function foo() {
console.log(this);
}
foo(); // 非严格模式 → window;严格模式 → undefined
严格模式如何改变默认绑定行为
严格模式通过 "use strict" 声明启用,它让 JavaScript 引擎对代码执行更严格的检查,其中就包括对 this 的处理。
立即学习“Java免费学习笔记(深入)”;
- 全局作用域开启严格模式会影响所有普通函数调用中的
this - 函数内部单独开启严格模式,只影响该函数内的默认绑定
- 箭头函数不受严格模式影响——它的
this始终由外层词法作用域决定,与调用方式无关
注意:即使在严格模式下,call(null) 或 call(undefined) 仍会让 this 变为 undefined,这和默认绑定一致,但本质是显式绑定的特殊处理。
常见陷阱与规避建议
开发者常因忽略默认绑定规则,在回调、定时器或事件处理器中意外丢失 this。
- 避免直接传入裸函数:
setTimeout(obj.method, 100)→ 此时method被普通调用,this失效 - 改用箭头函数或
bind显式绑定:setTimeout(() => obj.method(), 100)或setTimeout(obj.method.bind(obj), 100) - 在类方法中,若需作为回调使用,推荐在构造函数中提前绑定:
this.handleClick = this.handleClick.bind(this) - 模块化开发中,ES6 模块默认处于严格模式,所以默认绑定天然就是
undefined,无需额外声明
总结关键区别
是否严格模式,决定了默认绑定下 this 是“全局对象”还是“undefined”。这不是语法错误,而是设计选择——严格模式拒绝隐式、易错的全局绑定,推动开发者显式管理上下文。
理解这一点,能帮你快速定位 Cannot read property 'xxx' of undefined 类型的错误根源,尤其在解构赋值或高阶函数传参时。


















