Подтвердить что ты не робот

Зачем использовать "применять"?

Этот фрагмент вырезается из секретов JavaScript-ниндзя.

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)?

4b9b3361

Ответ 1

Если у вас

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

В этом случае функция журнала может принимать любое количество аргументов.

Используя .apply(), не имеет значения, сколько аргументов передано. Вы можете дать набору console.log(), и они будут поступать как отдельные аргументы.

Итак, если вы выполните:

console.log(arguments)

... вы фактически предоставляете console.log один объект Arguments.

Но когда вы делаете:

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 предметов. Он будет работать в любом случае.

Ответ 3

Функция 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 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.

Ответ 4

Давайте обсудим некоторый фон, почему 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);

Ответ 5

console.log(arguments) отправит один аргумент в console.log, массив аргументов, переданный вашему методу журнала. console.log.apply(console, arguments) отправляет возможно несколько аргументов в виде нескольких аргументов вместо одного массива.