Вызов метода apply с аргументами в JavaScript

Я хотел вызвать функцию с помощью метода javascript apply (). Это прекрасно работает, если функция не имеет аргументов. т. е.

function test()
{
  console.log(this);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test.apply(body); // returns [object HTMLBodyElement]

но я не могу сделать то же самое, чтобы вызвать функцию, которая имеет аргументы:

function test(msg)
{
  console.log(msg);
}

body = document.getElementsByTagName("body")[0]; // shortcut to body element

test(this).apply(body); // mysteriously returns the correct result, then
// typeError: 'undefined' is not an object (evaluating "test(this).apply".

приведенные выше примеры совершенно тривиальны, но суть моего вопроса: Как использовать метод apply () для вызова функции с аргументами.

4 ответов


apply принимает два аргумента:

test.apply(null, [body]);

первый аргумент устанавливает значение this при выполнении функции. Второй-это массив параметров для этой функции.

в ваших примерах вы можете переписать его следующим образом:

function test() {
    console.log(this);
}

и назовите это следующим образом:

test.apply(this);

Сначала обратите внимание, что вы фактически вызываете свою функцию немедленно, строка:

test(this).apply(body);

не удается, потому что сначала вы называете передает this в качестве аргумента, а затем вы пытаетесь получить доступ к apply свойство результата функции, которое является undefined так как ваша функция не возвращает ничего.

это свойство доступа на undefined значение дает вам TypeError исключения.

теперь, давайте посмотрим что вы на самом деле хотите сделать, если хотите передать значение body переменная в качестве аргумента вашей функции, установка внешнего this значение, как this стоимостью test, вы можете сделать:

test.apply(this, [body]);

но именно поэтому call метод существует, когда вы точно знаете, какие аргументы передать, вам не нужно создавать массив для Ничего, вы просто передаете аргументы:

test.call(this, body);

на apply метод действительно полезен, когда вы имеете дело, например, с динамическое количество аргументов, когда вы знаете, какие аргументы хотите передать, и все еще имеете возможность установить this значение call это как раз то, что вам нужно.


С apply вы отправляете массив аргументов в качестве второго аргумента:

test.apply(body,["Hello World"]);

вот документация apply на документах MDNhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply


обязательно добавьте в аргумент:

test.apply(body, ["my message here"]);