为什么要用“申请”?

时间:2011-02-14 03:41:38

标签: javascript

此片段是从JavaScript Ninja的秘密中删除的。

function log() {
    try {
        console.log.apply( console, arguments );
    } catch(e) {
        try {
            opera.postError.apply( opera, arguments );
        } catch(e){
            alert( Array.prototype.join.call( arguments, " " ) );
        }
    }
}

我为什么要使用申请?console.log.apply(console, arguments)console.log(arguments)之间有什么区别?

5 个答案:

答案 0 :(得分:36)

在这种情况下,日志功能可以接受任意数量的参数。

使用.apply(),传递多少个参数无关紧要。您可以将该集合赋予console.log(),它们将作为单独的参数到达。

所以,如果你这样做:

console.log(arguments)

...您实际上只给console.logArguments个对象。

但是当你这样做时:

console.log.apply( console, arguments );

......好像你分别通过了它们。

使用.apply()这样的其他有用示例可以在其他可以接受可变数量参数的方法中得到证明。其中一个例子是Math.max()

典型的电话是这样的:

var max = Math.max( 12,45,78 );  // returns 78

...返回最大数字。

如果您确实拥有需要最大值的数组,该怎么办?您可以使用.apply()来传递集合。 Math.max会认为它们是作为单独的参数而不是数组发送的。

var max = Math.max.apply( null, [12,45,92,78,4] );  // returns 92

如您所见,我们不需要事先知道将传递多少个参数。数组可以有5或50个项目。无论哪种方式都可以。

答案 1 :(得分:13)

如果你有

function log() {
    console.log.apply(console, arguments);
}

并将其称为log('foo');,然后转换为console.log.apply(console, ['foo']);,这相当于console.log('foo');,这就是您想要的。

如果您将其定义为

function log() {
    console.log(arguments);
}

而不是log('foo');相当于log(['foo']);,这不是你想要的。

答案 2 :(得分:6)

apply函数更改了被调用者中this的值,并允许您为参数传递数组。

例如,如果要将数组作为参数传递给函数:

function foo(value1, value2, value3) {
    alert("Value 1 is "+value1+".");
    alert("Value 2 is "+value2+".");
    alert("Value 3 is "+value3+".");
}
var anArray=[1, 2, 3];
foo(anArray); // This will not work. value1 will be anArray, and value 2 and 3 will be undefined.
foo.apply(this, anArray); // This works, as anArray will be the arguments to foo.

或者,另一种用途:更改this

function Foo() {
    this.name="world";
    this.sayHello=function() {
        alert("Hello, "+this.name);
    };
}
var foo=new Foo();
foo.sayHello(); // This works, as this will be foo in foo's sayHello.
var sayHello=foo.sayHello;
sayHello(); // This does not work, as this will not be foo.
sayHello.apply(foo, []); // This will work, as this will be foo.

答案 3 :(得分:6)

让我们讨论一些背景知识,当apply方法具有相似语法时,为什么call特别存在。

首先,我们需要了解一些主题:

Variadic功能:

  

在计算机编程中,它是一个可以接受任何数字的功能   争论。

数据结构是JavaScript:

在javascript中,如果我们处理的数据比最常用的数据结构是数组,并且在大多数情况下我们以数组的形式获取数据。

现在,如果我们在javascript中执行任何可变参数函数,那么我们的调用将会是这样的 -

average是一个可变函数,它的调用看起来像,

average(1,2,3);
average(1);
average(3,5,6,7,8);

如果以数组格式获取数据(在大多数情况下,我们将以数组格式获取Variadic函数的数据),而不是像我们需要调用我们的函数 -

average(array[0],array[1],array[2],array[3],.... and so on)

如果我们得到一个长度为100个项目的数组,我们会这样写吗?

不,我们有apply方法,专门用于此目的。

average.apply(null,array);

答案 4 :(得分:0)

console.log(arguments)会向console.log发送一个参数,传递给你的log方法的参数数组。 console.log.apply(console, arguments)可能将多个参数作为多个参数而不是单个数组发送。