我学习以下代码来记录日志:
console.log.apply( console, arguments );
apply()
在这里的目的是什么?
为什么不直接使用console.log("message", arguments)
?
我学习以下代码来记录日志:
console.log.apply( console, arguments );
apply()
在这里的目的是什么?
为什么不直接使用console.log("message", arguments)
?
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);
console.log.apply(console, arguments);
可以改为 Function.prototype.apply.call(console.log, console, arguments);
。 - Victorapply()
函数通过提供一个数组作为参数,调用另一个函数并指定该函数的this
值。
使用隐式的func.apply(obj, args)
的原因是确保在func()
内部,this
指向obj
。
我认为两个答案都没有解释“为什么”。这种编程方式的真正亮点。
我不喜欢第一个得票最高的答案。即使读了三遍,我也无法理解它,而第二个答案则感觉不完整。
我认为编写这种方式的主要目的是在函数(或闭包)中使用它。
因此,这行代码只有在您自定义的记录器内才有意义: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 );
}
console.log(...arguments)
。 - Samathingamajig