严格模式下默认绑定的this为undefined,非严格模式下指向全局对象;直接调用、赋值后调用、回调未绑定、iife均触发默认绑定;严格模式使this访问报typeerror,箭头函数不受影响;非严格模式易污染全局;建议主动启用严格模式。

默认绑定在严格模式下,this 值为 undefined;非严格模式下则指向全局对象(浏览器中是 window,Node.js 中是 global)。这个差异不是“可选行为”,而是引擎强制执行的规则,直接影响代码是否报错、是否污染全局、是否可预测。
哪些调用会触发默认绑定
只要函数没被显式绑定,也没作为对象方法或构造函数调用,就走默认绑定。常见情况包括:
- 直接调用:
foo() - 赋值后调用:
const fn = obj.method; fn(); - 回调未绑定:
setTimeout(foo, 100)或[1,2].forEach(foo) - 立即执行函数表达式(IIFE):
(function(){ console.log(this); })();
严格模式如何改变 this 的行为
启用 "use strict" 后,普通函数调用中的 this 不再自动绑定到全局对象,而是保持原始值 undefined:
- 访问
this.x或赋值this.y = 1会立即抛出TypeError - 该规则只作用于当前作用域:可在整个脚本顶部声明,也可仅在单个函数内启用
- 箭头函数不受影响——它的 this 始终由外层词法作用域决定,与是否严格模式无关
非严格模式下的潜在风险
看似“能跑通”的写法,背后可能埋着隐患:
-
this.name = 'abc'实际修改了window.name,污染全局命名空间 - 未声明变量赋值(如
a = 1)会静默创建全局变量,引发隐蔽冲突 - 重复参数名(
function f(a, a) {})或对象属性名不会报错,但逻辑可能偏离预期
现代开发中的实践建议
ES6 模块、class 语法默认启用严格模式,主流构建工具(如 Webpack、Vite)也默认开启。因此:
- 建议在脚本顶部主动添加
"use strict";,让错误更早暴露 - 避免依赖
this在默认绑定下“意外可用”,改用显式传参或箭头函数 - 调试时注意控制台报错类型:若看到
Cannot set property 'x' of undefined,大概率是严格模式下的默认绑定所致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











