在这种情况下,JavaScript的apply()有什么作用?

6

我学习以下代码来记录日志:

console.log.apply( console, arguments );

apply()在这里的目的是什么?

为什么不直接使用console.log("message", arguments)


旧的写法是 console.log(...arguments) - Samathingamajig
3个回答

8
console.log("message", arguments)

使用两个参数“message”和类似数组的对象arguments调用log函数。

console.log.apply( console, arguments );

将其使用的数组对象arguments的长度n作为参数调用它。换句话说,arguments会被展开成单独的参数。该方法的上下文是console。例如:

function foo(a, b, c)
{
  console.log.apply( console, arguments );
}
foo(1,2,3);

大致等价于:

console.log(1,2,3);

1
为了兼容IE9,console.log.apply(console, arguments); 可以改为 Function.prototype.apply.call(console.log, console, arguments); - Victor

7
apply()函数通过提供一个数组作为参数,调用另一个函数并指定该函数的this值。

使用隐式的func.apply(obj, args)的原因是确保在func()内部,this指向obj


0

我认为两个答案都没有解释“为什么”。这种编程方式的真正亮点。

我不喜欢第一个得票最高的答案。即使读了三遍,我也无法理解它,而第二个答案则感觉不完整。

我认为编写这种方式的主要目的是在函数(或闭包)中使用它。

因此,这行代码只有在您自定义的记录器内才有意义:console.log.apply( console, arguments );

可能这比写成这样更好:

function my_worse_way_to_log_dynamic_args ( [several dynamic arguments] )
{
    // loop each argument
    // call console.log for each one
}

function my_better_way_to_log_dynamic_args ( [several dynamic arguments] )
{
    console.log.apply( console, arguments );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接