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