Вызов метода 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