函数.调用类似数组的对象,不需要第一个参数
Function.call taking array-like object , doesnt require the first parameter?
所以,我找不到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;};
然后,当您使用参数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
,并将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)
- 使用一个Javascript函数提交多个表单可以在FF中工作,而不需要其他浏览器
- 在Knockout js中创建一个包含多行的表,而不需要推送
- 看起来第一个console.log是'It’不太对
- 仅将 CSS 规则应用于
中的第一个 ,而不分配类/ID - 我的设备后退按钮工作不正常,它转到第一个html,但返回到第二个html
- 我可以在React和Redux中发送一个AJAX调用,而不需要操作创建者和还原器吗
- 第一个jQuery.animate()不工作
- 我需要添加一个变量而不添加(使用算术运算符)
- XMLHttpRequest,使用多个1不起作用,只是第一个.需要使用多个
- JS深度比较2个对象并删除在第二个对象中找到的项目,而不是第一个
- 读取下拉列表中所选的值,而不读取第一个值
- 角度下拉列表不显示第一个值
- 渐明,淡出DIV上循环工作良好-但不显示第一个DIV
- jQuery图像滑块首先加载合并的第三和第四的图像,而不是第一个
- jQuery可能放在同一行的第一个,也可能不是第一个
- 删除最后一个无效字符,而不是第一个(javascript验证)
- .after()当我点击这个按钮后,第二个,而不是第一个
- 我需要阿贾克斯在第二个点开火,而不是第一个
- JS不读取第一个ID,只读取第二个ID
- 如何在不更改第一个js文件的情况下,使用另一个javascript程序为其添加功能