我如何使用 Function.prototype.call 而不是应用?

how can i use Function.prototype.call instead of apply?

我正在尝试使用 'Function.prototype.call' 而不是 'Function.prototype.apply' 在 ie8 中使用。

function testLog(){
  console.log.apply(console, arguments) // not supported 'apply' ie8
}
testLog(1,2,3) // 1,2,3
ie8不支持

'Function.prototype.apply',

function testLog(){
  // console.log.call(console, ...arguments)  //not supported 'spread operator' ie8

  console.log.call(console, Array.prototype.slice.call(arguments));
}
testLog(1,2,3) // [1,2,3]  

我尝试使用 'Function.prototype.call',但我遇到了麻烦,因为 ie 不支持扩展运算符。

如何使用 'Function.prototype.call' 得到 1,2,3 而不是 [1,2,3]?


补充说明

我没发现 console.log 不支持 ie8.

但是, console.log 是作为例子写的。我希望重点放在 'apply' 和 'call'

此外,目前运行在ie8上,'call'启用,'apply'仍然不可用。

[申请]https://caniuse.com/?search=ES%205.1%3A%20generic%20array-like%20object%20as%20arguments

[呼唤]https://caniuse.com/?search=JavaScript%20built-in%3A%20Function%3A%20call

如T.J。 Crowder 能够在他的 answer (now deleted) 和评论中测试并确认,Internet Explorer 8 中的 console.log 没有(完整的)Function 原型。

I’ve just verified that although IE8 supports Function.prototype.apply and call on JavaScript functions, it doesn’t support either of them on console.log. (console is host-provided. Host-provided functions don’t have to be full JavaScript functions, and they were very weird in older versions of IE.)

T.J. Crowder, 2021-08-23 08:43:41 UTC

这意味着直接在 console.log 上调用 .apply 是行不通的。尽管如此,它仍然是一个函数,因此它应该像一个函数一样运行,即使它没有公开您期望它具有的方法。

为了获得您希望通过表达式获得的结果

console.log.apply(console, arguments);

您可以在 console.log 上间接调用 apply,使用 Function.prototype.call:

Function.prototype.apply.call(console.log, console, arguments);

这使用上下文 console.log 调用方法 apply 并提供 consolearguments 作为参数,看起来就像 console.log.apply(console, arguments).

这也适用于现代浏览器,当然,它适用于任何接受任意数量参数的函数,例如Math.max: Function.prototype.apply.call(Math.max, Math, arguments).

请注意 apply 中的“数组”必须是适当的 Arrayarguments 对象,而不是任何类似数组的通用对象(如 { 0: 4, 1: 2, length: 2 } ).这是因为,ECMAScript 5.1 的 MDN confirms, IE8 doesn’t support a generic array-like object as an arguments. Appendix E 更具体一些:在 IE8 中,只允许 Arrays 和 arguments 对象作为 apply 的第二个参数。