Usando chamar e aplicar em javascript

Você pode executar funções em diferentes contextos, tirando proveito dos métodos de chamada e aplicação em javascript. A melhor maneira de explicá-los é mostrar algum código

var foo = function () {
console
.log('my name is ' + this.name)
};

obj1
= {
name
: 'Andrei'
}

Queremos chamar a função foo nesse objeto, então fazemos isso

foo.call(obj1)

O que simplesmente chama a função passando em um novo contexto. A diferença entre os dois métodos, call e apply é a maneira como passamos parâmetros extras para a função foo.
Para ligar faríamos

foo.call(obj1, bar, baz);

Para aplicar, faríamos

foo.apply(obj1, [bar, baz]);

Mundo real
Achei essa dica muito útil ao trabalhar com jQuery. Estou trabalhando em um aplicativo javascript com muitos botões que acionam diferentes eventos. O problema é que este sempre se refere ao botão acionado, mas não estou interessado nisso, eu quero isso para se referir ao elemento DOM que estou prestes a mudança.

$('#close').on('click', function(){
// let's imagine $elem is a jQuery element
// that changes depending on user actions
fadeOut
.call($elem);
})

Minha função fadeOut pode fazer várias coisas, como diminuir a opacidade ao longo de um período de tempo, alterar a posição do elemento fora de vista e assim por diante e pode ser usada em diferentes elementos sem alterar o código, apenas alterando o contexto .

var fadeOut = function () {
// just an example
this.toggleClass('fade-out');
}