我如何使用 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
并提供 console
和 arguments
作为参数,看起来就像 console.log.apply(console, arguments)
.
这也适用于现代浏览器,当然,它适用于任何接受任意数量参数的函数,例如Math.max
: Function.prototype.apply.call(Math.max, Math, arguments)
.
请注意 apply
中的“数组”必须是适当的 Array
或 arguments
对象,而不是任何类似数组的通用对象(如 { 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 中,只允许 Array
s 和 arguments
对象作为 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
andcall
on JavaScript functions, it doesn’t support either of them onconsole.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
并提供 console
和 arguments
作为参数,看起来就像 console.log.apply(console, arguments)
.
这也适用于现代浏览器,当然,它适用于任何接受任意数量参数的函数,例如Math.max
: Function.prototype.apply.call(Math.max, Math, arguments)
.
请注意 apply
中的“数组”必须是适当的 Array
或 arguments
对象,而不是任何类似数组的通用对象(如 { 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 中,只允许 Array
s 和 arguments
对象作为 apply
的第二个参数。