You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Array.push作为参数传入JavaScript的forEach时抛出异常的原因

为什么直接传递array1.push给forEach会抛出异常?

这个问题其实是JavaScript里this绑定机制的经典坑,我来给你拆解清楚:

先看正常工作的代码逻辑

你最初写的匿名函数版本:

var array1 = [1, 2];
var array2 = [3, 4];
array2.forEach(function(value) { array1.push(value); });

这里调用array1.push(value)的时候,push方法的this是明确指向array1的——因为你是通过array1.这个对象属性访问的方式调用它,所以push内部能正确识别到要操作的数组对象,自然能正常执行。

再看出问题的版本哪里错了

当你把array1.push直接传给forEach时:

var array1 = [1, 2];
var array2 = [3, 4];
array2.forEach(array1.push);

这里相当于把push函数本身作为一个独立的值传递给了forEach,它和原来的array1的绑定关系被切断了!

forEach在执行回调函数时,默认情况下不会把array1作为this传给push——严格模式下this会变成undefined,非严格模式下会指向全局对象(比如浏览器里的window)。而push方法要求它的this必须是一个数组对象,当this是undefined时,就会抛出你看到的「Cannot convert undefined or null to object」错误。

几种修复方法

想要让push正确绑定array1,你有这几种选择:

  1. 用bind固定this:
var array1 = [1, 2];
var array2 = [3, 4];
array2.forEach(array1.push.bind(array1));
console.log(array1); // 输出 [1, 2, 3, 4]

bind会返回一个新函数,这个函数的this永远绑定为你传入的array1,不管在哪里调用它。

  1. 用箭头函数继承this:
var array1 = [1, 2];
var array2 = [3, 4];
array2.forEach(value => array1.push(value));

箭头函数没有自己的this,它会继承外层作用域的this,这里自然能正确指向array1,效果和你最初的匿名函数一致,但写法更简洁。

  1. 利用forEach的第二个参数指定this:
var array1 = [1, 2];
var array2 = [3, 4];
array2.forEach(array1.push, array1);

forEach的第二个参数会被当作回调函数执行时的this值,这样push内部的this就会指向array1。

总结

函数作为独立值传递时,会丢失原本的this绑定——这是JavaScript中非常常见的误区,尤其是在处理对象方法的时候。只要记住:如果某个方法依赖于它的this指向原对象,直接传递方法本身就会出问题,需要手动绑定this或者用闭包(比如匿名函数、箭头函数)来保留上下文。

内容的提问来源于stack exchange,提问作者Arashsoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:41