函数.调用类似数组的对象,不需要第一个参数

Function.call taking array-like object , doesnt require the first parameter?

本文关键字:不需要 第一个 参数 对象 调用 数组 函数      更新时间:2023-09-26

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

argsSliced = Array.prototype.slice.call((function(){return arguments;})(1,2,3,4))

尽管接下来的代码行的行为与我们预期的一样,但要求第一个参数是一个对象才能将函数的this设置为该对象,并要求参数传递给该对象之后的函数。

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的,因为它没有给它一个对象作为第一个参数,而是只给一个类似数组的对象。

调用此函数时,返回一个类似数组的Arguments对象,其参数为

var f = function(){return arguments;};

然后,当您使用参数1234调用它时,

f(1,2,3,4) // Arguments [1,2,3,4]

然后,在Array.prototype.slice上调用Function.prototype.call,将Arguments对象作为参数传递。

因此,Function.prototype.call将调用Array.prototype.slice,并将this值设置为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]

调用的MDN()清楚地解释了这一点:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

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

var a = function(){return arguments[0] + arguments[1] ; }
console.log(a.call(1,2));

自变量[1]将是undefined,2将是arguments[0],因为1将被装箱到一个对象中。

记住f.call(ob,4);就像说ob.f(4)