Методы call() и apply() позволяют выполнить косвенный вызов функции, как если бы она была методом другого объекта. Первым параметром ободим методам передается объект, относительно которого вызывается функция, этот аргумент определяет ключевое слово this в теле функции.
Чтобы вызвать функцию без аргументов, ка метод объекта o, можно использовать любой из методов: call() или apply().
f.call(o); f.apply(o);
call()
Метод call может применяться для вызова функции в контексте нужного объекта:
call() var Animal1 = {name: 'Cat'} var Animal2 = {name: 'Dog'} function sayName() { // this — ссылка на объект, в контексте которого вызвана функция alert(this.name); } sayName.call(Animal1) // выдаст сообщение "Cat" sayName.call(Animal2) // выдаст сообщение "Dog"
При этом совершенно не важно, какому объекту принадлежит функция. В качестве текущего(this) объекта будет взят первый аргумент.
var Animal1 = { name: 'Cat', sayName: function() { alert(this.name); } }; var Animal2 = {name: 'Dog'}; Animal1.sayName() // выдаст сообщение "Cat" Animal1.sayName.call(Animal2) // выдаст сообщение "Dog"
Помимо смены контекста вызова, метод call может передавать в функцию аргументы:
var obj = {attr: 10}; function sum(a, b) { alert(this.attr + a + b); } sum.call(obj, 5, 2) // выдаст сообщение с результатом "17"
Если контекст вызова не указан, то функция будет выполнятся в контексте заданного объекта:
window.a = 5 function sayThis() { alert(this.a); } sayThis.call() // выдаст 5 window.a = 5 function sayThis(b) { alert(this.a + b); } sayThis.call(null, 3) // выдаст 8
apply()
Метод apply() действует точно также, как метод call(), за исключением того, что apply() аргументы для функции передает ввиде элементов массива:
f.apply(o,1,2);
Метод apply() получает массив аргументов и вызывает функцию, как будто каждый элемент массива является отдельным аргурментом вызова функции. Поэтому он полезен для вызова вариативных (с неизвестным количеством аргументов) функций с вычисляемым массивом аргументов.
Кроме массива аргументов, метод apply получает первый аргрумент, указывающий на вариант связывания this для вызываемой функции. Если функция не ссылается на this, ей можно передать null.
var score = [0,1,2] average.apply(null, score); // это будет равносильно вызову average(score[0], score[1], score[2])
Если функция ссылается на this, то необходимо вместо null указать объект, в котором находятся ссылки this.
var obj = {} var scor = [0,1,2] average.apply(obj, score); // это будет равносильно вызову: {obj.average(scor[0],scor[1],scor[2])
Т.е. функция average превратилась в метод объекта obj.
Еще один пример использования apply():
var test = [1,7,2,20]; alert(sum.apply(null, test)); //выведет 30