JavaScript中this的默认绑定在严格模式下为undefined,非严格模式下指向全局对象;仅适用于独立调用函数(如foo()、IIFE、setTimeout回调),不影响隐式、显示、new或箭头函数绑定。

在 JavaScript 中,this 的默认绑定行为在严格模式与非严格模式下有本质区别:关键只看函数是否以“独立调用”方式运行(即没有点号调用、没用 call/apply/bind、不是箭头函数或构造调用),此时严格模式会让 this 为 undefined,而非严格模式则指向全局对象(浏览器中是 window,Node.js 中是 globalThis)。
什么是默认绑定
默认绑定发生在函数被直接调用、没有任何调用上下文时,例如:
-
foo()—— 没有点号、没有绑定、不是方法 -
(function(){})()—— 立即执行函数表达式(IIFE) -
setTimeout(foo, 100)中的foo
这种调用方式不依赖对象、不显式传入上下文,就触发默认绑定规则。
非严格模式:this 指向全局对象
只要脚本或函数未启用严格模式,独立调用的函数中 this 就自动绑定到全局对象:
立即学习“Java免费学习笔记(深入)”;
- 浏览器环境:
this === window为true - Node.js 环境:
this === globalThis为true - 全局变量(如
var x = 1)会成为该对象的属性,所以this.x可读可写
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function say() { console.log(this.name); }
say(); // 输出 "global"(因为 this === window)
严格模式:this 为 undefined
只要函数在严格模式下执行,且属于默认绑定场景,this 值就是 undefined:
- 可通过脚本顶部加
"use strict";全局启用 - 也可在函数体第一行写
"use strict";,仅对该函数生效 - ES6 模块(
.mjs文件或<script type="module">)自动启用严格模式
此时访问 this.xxx 会直接报错:TypeError: Cannot read property 'xxx' of undefined。
示例:
'use strict';var name = 'global';
function say() { console.log(this.name); }
say(); // 报错:Cannot read property 'name' of undefined
注意:严格模式只影响默认绑定
其他四种 this 绑定方式不受影响:
- 隐式绑定(
obj.method()):仍指向obj - 显示绑定(
fn.call(obj)):仍按传入对象决定this - new 绑定(
new Fn()):仍指向新创建的实例 - 箭头函数:不绑定
this,始终继承外层作用域的this,与严格与否无关
也就是说,"use strict" 不会让 obj.fn() 的 this 变成 undefined,也不会让 fn.bind({x:1})() 失效。

















