Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这会抛出一个未定义的异常?_Javascript - Fatal编程技术网

Javascript 为什么这会抛出一个未定义的异常?

Javascript 为什么这会抛出一个未定义的异常?,javascript,Javascript,如果x为非空,则第3行将在null或undefined上调用Uncaught TypeError:Array.prototype.push var x = [] var y = [] x.forEach (y.push) 注: x、 forEach将3个参数传递给y.push,其中1个是y。明确执行此操作不会导致错误 var x = [ 1 ] var y = [] x.forEach (y.push) 在匿名函数中封装y.push将防止错误,即使所有参数都已传递。据我所知,应用的参数数量并

如果x为非空,则第3行将在null或undefined上调用
Uncaught TypeError:Array.prototype.push

var x = []
var y = []
x.forEach (y.push)
注: x、 forEach将3个参数传递给y.push,其中1个是y。明确执行此操作不会导致错误

var x = [ 1 ]
var y = []
x.forEach (y.push)
在匿名函数中封装y.push将防止错误,即使所有参数都已传递。据我所知,应用的参数数量并不重要

y.push (1, 1, y)
使用null和undefined显式调用y.push不会导致错误,即使尝试使用其他可选参数欺骗它

x.forEach (function (a, b, c, d, e, f, g, h, i, j) {
  y.push (a, b, c, d, e, f, g, h, i, j)
})

因为当您将
y.push
传递给
.forEach()
时,它会丢失
y
上下文,并且当
.forEach()
调用它时,您只会得到带有不适当值的push方法

您可以通过如下方式绑定对象使其工作:

y.push (1, 2, 3, undefined, 5, 6, null, 7, 8)
当然,这还有其他问题,
forEach()
传递了一个以上的参数,而
.push()
将接收这些参数。因此,您确实无法成功地使用这个简短的表单组合数组


当你做这样的事情时

var x = [];
var y = [];
x.forEach (y.push.bind(y)); // push the x items into y
此时,
m===Array.prototype.push
m
中没有绑定到方法的对象。这是Javascript的一个微妙之处,会让很多人大吃一惊,但当您真正了解内部情况时,它确实开始有意义了

.push()
只是对象上的一个属性,因此当您将该属性放入变量或将其作为参数传递时,此时它只是它自己的值,不再与从中获取它的对象有任何关联

因此,要在从对象抓取后正确地使用它,必须使用类似于
.call()
.apply()
.bind()
的东西将它绑定到对象,以便在该对象上使用它


如果您要做的只是将所有x元素复制到y的末端,那么有很多方法可以做到这一点。您可以这样做:

var y = [];
var m = y.push;
由于
.push()
接受多个参数,因此只需将整个
x
数组传递给
.push()

在ES6中,这更容易:

y.push.apply(y, x);

这么快的反应。似乎就是这样。非常奇怪的是,实例引用没有像其他变量那样绑定在闭包中。我会在几分钟内接受答案。感谢you@user3288049-在第一个代码示例中未创建闭包。您刚刚向
x.forEach()
传递了一个函数引用-仅此而已
x.forEach()
然后像调用普通函数一样调用该函数引用,因为它不是作为普通函数调用的(它是作为方法调用调用的),所以无法正常工作。我在原始问题中添加了ES5和ES6解决方案。
y.push(...x);