提问人:nowjsio 提问时间:8/23/2021 最后编辑:nowjsio 更新时间:8/23/2021 访问量:352
如何使用 Function.prototype.call 而不是 apply?
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]?
附加说明
我没有发现 ie8 不支持控制台.log。
但 console.log 作为示例编写。我希望重点应该放在“应用”和“调用”上
此外,目前在 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 在他的回答(现已删除)和评论中能够测试和确认的那样,在 Internet Explorer 8 中没有(完整的)原型。console.log
Function
我刚刚验证了尽管 IE8 支持 和 JavaScript 函数,但它不支持它们中的任何一个。( 由主机提供。主机提供的函数不一定是完整的 JavaScript 函数,它们在旧版本的 IE 中非常奇怪。
Function.prototype.apply
call
console.log
console
— TJ 克劳德,2021-08-23 08:43:41 UTC
这意味着直接调用 不起作用。尽管如此,它仍然是一个函数,因此它应该表现得像一个函数,即使它没有公开你期望它具有的方法。.apply
console.log
为了获得您期望使用表达式获得的预期结果
console.log.apply(console, arguments);
您可以使用以下方法间接调用:apply
console.log
Function.prototype.call
Function.prototype.apply.call(console.log, console, arguments);
这将调用具有上下文的方法,并提供 and 作为参数,这看起来就像 。apply
console.log
console
arguments
console.log.apply(console, arguments)
这也适用于现代浏览器,当然,它适用于任何接受任意数量参数的函数,例如 : .Math.max
Function.prototype.apply.call(Math.max, Math, arguments)
请注意,中的“数组”必须是适当的或对象,而不是任何通用的类似数组的对象(如)。这是因为,正如 MDN 所确认的那样,IE8 不支持将类似数组的通用对象作为 .ECMAScript 5.1 的附录 E 更具体一些:在 IE8 中,只允许将 s 和 objects 作为 的第二个参数。apply
Array
arguments
{ 0: 4, 1: 2, length: 2 }
arguments
Array
arguments
apply
评论
slice
apply
arguments
try
try
评论
apply
应该从 IE 5.5 开始支持。 应该工作正常。你确定这不是你需要担心的吗?你真的需要支持 IE 8 吗?console.log.apply(console, Array.prototype.slice.call(arguments));
console.log
console.log
console
call
apply
call
console.log