foreach 通过第二个参数 thisarg 显式指定回调函数的 this 值;箭头函数因无自身 this,thisarg 对其无效;bind 或闭包可间接实现,但非标准做法。

JavaScript 中 forEach 本身不改变回调函数的 this 指向,但提供了第二个参数专门用来指定回调内部的 this 值。
用 forEach 的第二个参数绑定 this
这是最直接、标准的做法。在调用 forEach 时,传入一个额外的参数(放在回调函数之后),它就会成为回调函数执行时的 this:
- 语法:
array.forEach(callback, thisArg) -
thisArg会作为callback内部的this值 - 如果没传
thisArg,非严格模式下this是全局对象(如window),严格模式下是undefined
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { name: 'Alice', count: 0 };
[1, 2, 3].forEach(function (item) {
console.log(this.name); // 'Alice'
this.count += item;
}, obj); // ? 这里传入 obj 作为 this
console.log(obj.count); // 6
用箭头函数注意:this 不可被 forEach 改变
箭头函数没有自己的 this,它会继承外层作用域的 this,因此 forEach 的第二个参数对它无效:
- 即使你写了
forEach((x) => {...}, obj),箭头函数里的this仍是定义时所在上下文的this - 若想用箭头函数并控制
this,需在外层确保this正确(比如在类方法或对象方法中定义)
其他等效方式(不推荐但可行)
虽然 forEach 自带 thisArg 最简洁,但也可以用这些方式间接实现:
-
bind:把回调函数提前绑定this,再传给forEach——arr.forEach(cb.bind(obj)) - 闭包变量:用外部变量代替
this,比如const self = obj; arr.forEach(item => { self.xxx }) -
call/apply不适用于forEach回调,因为forEach内部调用回调时不会用它们
常见误区提醒
- 误以为
forEach(() => {})能通过第二个参数改this—— 实际无效 - 忘记传
thisArg导致this指向意外(尤其严格模式下报错) - 在类方法中直接写
this.arr.forEach(...)却没绑定this,导致回调里this丢失(这时应使用thisArg或箭头函数 + 正确外层this)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










