Javascript 为什么这会抛出一个未定义的异常?
如果x为非空,则第3行将在null或undefined上调用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将防止错误,即使所有参数都已传递。据我所知,应用的参数数量并
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);