Вызовите метод apply с аргументами в JavaScript - PullRequest
16 голосов
/ 06 октября 2011

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

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 ]

30 голосов
/ 06 октября 2011

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

test.apply(null, [body]);

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

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

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

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

test.apply(this);
8 голосов
/ 06 октября 2011

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

test(this).apply(body);

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

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

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

test.apply(this, [body]);

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

test.call(this, body);

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

6 голосов
/ 06 октября 2011

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

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

Вот прикладная документация по документам MDN https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

0 голосов
/ 06 октября 2011

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

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