Javascript Function.call采用类似数组的对象,不需要第一个参数吗?

Javascript Function.call采用类似数组的对象,不需要第一个参数吗?,javascript,function,Javascript,Function,因此,我无法找到Function.call如何不必将第一个参数作为对象,因为我在任何地方都找不到这样的信息。尽管我已经看到Function.call的数百种用法,就像下一行代码一样,只使用这个类似于数组的对象,而不需要第一个参数作为对象,因为它使用类似于数组的对象Function的参数。这当然有效 argsSliced = Array.prototype.slice.call((function(){return arguments;})(1,2,3,4)) 虽然接下来的代码行的行为与我们预期

因此,我无法找到Function.call如何不必将第一个参数作为对象,因为我在任何地方都找不到这样的信息。尽管我已经看到Function.call的数百种用法,就像下一行代码一样,只使用这个类似于数组的对象,而不需要第一个参数作为对象,因为它使用类似于数组的对象Function的参数。这当然有效

argsSliced = Array.prototype.slice.call((function(){return arguments;})(1,2,3,4))
虽然接下来的代码行的行为与我们预期的一样,但要求第一个参数是一个对象,以将此函数设置为该对象,并要求参数传递给该对象之后的函数

var a = function(){return arguments[0] + arguments[1] ; }
console.log(a.call(1,2)); // returns NaN
console.log(a.call(null,1,2)); // behaves as we expect, returns 3
我的问题是,类似数组的对象是什么情况?它如何与Function.call一起工作,因为它没有将对象作为第一个参数提供给它,而是只提供类似于数组的对象

MDN for call()清楚地解释了这一点:

的值为函数调用提供。请注意,这可能不是 是该方法看到的实际值:如果该方法是 非严格模式代码,null和undefined将替换为 全局对象和基本值将转换为对象

参数[1]将是
未定义的
,而2将是
参数[0]
,因为1将被装箱到一个对象


记住
f.call(ob,4)
类似于说
ob.f(4)

这个函数在调用时,返回一个带有参数的类似数组的Arguments对象

var f = function(){return arguments;};
然后,当您使用参数
1
2
3
4
调用它时

f(1,2,3,4) // Arguments [1,2,3,4]
然后,在
Array.prototype.slice
上调用
Function.prototype.call
,将Arguments对象作为参数传递

因此
Function.prototype.call
将调用
Array.prototype.slice
,并将
值设置为Arguments对象(而不是
Array.prototype
),且不带参数

当对类似数组的对象调用
Array.prototype.slice
时,它将从该对象构建一个真正的数组。所以你得到了

Array.prototype.slice.call(f(1,2,3,4)); // Array [1,2,3,4]
注意:有更好的方法来实现这一点:

Array.of(1,2,3,4)
Array(1,2,3,4)
[1,2,3,4]

你的问题是什么?在第一个
argSliced
示例中,您将参数伪数组作为第一个(也是唯一一个)参数传递给
call
,因此它成为
this
to
slice
。在第二个示例中,在
a.call(1,2)
中,您将
1
作为第一个参数传递给
a
2
作为第一个参数,而第二个参数没有任何内容,因此
参数[1]
是未定义的,您将得到NaN。在下面的调用中,将null作为第一个参数传递给
a
1
作为第一个参数,
2
作为第二个参数,因此它显然返回3,因此,
这个
切片
。它使用参数
(1,2,3,4)
调用匿名函数,因此返回一个包含
[1,2,3,4]
的参数(类似数组)对象。我不明白您所说的“
未传递到切片”是什么意思。
Array.prototype.slice.call的第一个参数成为
slice
this
。在第二个示例中,您根本没有使用
this
slice
a
是根本不同的,因为
slice
this
数组或类似数组的对象进行操作,而
a
没有
this
。我知道这一点,因为
调用
就是这样工作的。第一个参数成为所调用函数的
this
。没有任何例外。在第一个示例中,有一个对象参数作为函数的第一个参数
function(){return arguments;}(1,2,3,4)
是一个对象。请解释下一票,如果我做错了至少让我知道,但是OP调用
call
,第一个参数是对象,而不是原语。我不明白这和问题有什么关系。谢谢你的回答,我感到困惑,这不是一个有效的问题。抱歉给你添麻烦了。
Array.of(1,2,3,4)
Array(1,2,3,4)
[1,2,3,4]