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');
}