JavaScript

Javascript Объясните, пожалуйста, методы apply, call и caller.

call вызывает функцию «перед точкой», а первый аргумент call устанавливается как значение this в вызываемой функции, а все остальные передаются как аргументы этой функции.

function test(color) {
  this.style.backgroundColor = color;
}

test.call(document.body, 'red');

При выполнении, this внутри функции будет указывать на document.body
_____

apply делает то же самое, но параметры функции принимает в виде массива:

test.apply(document.body, ['red']);
_____

Это достаточно искусственный пример. Оба они используются в редких специфичных случаях, когда нужно указать контекст вызова (значение this внутри функции).
_____

А обычный вызов любой функции test(x, y, z); эквивалентен

test.call(undefined, x, y, z);
test.apply(undefined, [x, y, z]);
_____

caller — deprecated, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
Яша Валиев
Яша Валиев
62 360
Лучший ответ
Nadir Haydarov даже не знал про caller. О оказывается deprecated )
Call - вызов метода в контексте объекта если в самом объекте этого метода нет.
function getFullName(name = 'Alex ') {
console.log(name + this.subname)
}
const Name = {
subname : 'Smirnov'
}
getFullName.call(Name, 'Ivan')// В Name изначально нет метода getFullName, без call будет [object Object]undefined
>>>
Что до caller, то в документации он обозначен как не рекомендуемый метод, значит и рассматривать его не зачем
Андрей Ткач
Андрей Ткач
50 023
apply вызывает функцию в контексте объекта, переданного первым параметром, используя в качестве аргументов массив, заданный вторым параметром.
call делает то же самое, но принимает параметры не в виде массива, а линейно, т. е, если функцию нужно выполнить с 5 аргументами, то call придётся вызвать с шестью (контекст + 5 аргументов).
Т. е. functionname.apply(a, b) аналогичен functionname.call(a, ..b), если b это массив (мейл. ру точку лишнюю вырезал).
caller не знаю, не использую
Знаю только про apply и call
1 из них принимает объект, а дугой массив. Но по работе они практически одинаковы.
Это даже что то вроде конструктора, который ты вызываешь через new.
применить вызвать и следить
Если вы не понимаете по-русски, задайте вопрос иначе или не ипите мозги. Могу помочь, но желание пропадает