将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,你有这几种选择:
- 用
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,不管在哪里调用它。
- 用箭头函数继承
this:
var array1 = [1, 2]; var array2 = [3, 4]; array2.forEach(value => array1.push(value));
箭头函数没有自己的this,它会继承外层作用域的this,这里自然能正确指向array1,效果和你最初的匿名函数一致,但写法更简洁。
- 利用
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

