Todas as funções do javascript possuem alguns métodos como toString(), call() e apply(). Antes de explicar o método function.call() vou exemplificar o funcionamento das funções e escopos, que acredito que isso facilite o entendimento.
Exemplo de código:
var url = 'andafter.org';
function f(){
console.log(this);
console.log(this.url);
}
f();
Nesse código eu seto uma variável global url, e quando chamo a função f dou um log em "this" (é a window), então quando chamo this.url o retorno é a variável instanciada fora da função.
O método call()
O método function.call() permite você dizer em qual escopo (essa é a nomenclatura certa? comentem suas opiniões) uma função deve ser executada.
Voltando ao exemplo de código anterior:
var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(){
console.log(this.url);
}
f.call(site);
O function.call() define o que será o "this" dentro da função, e este deve ser passado como parâmetro para o método call.
Método call com parâmetros
No exemplo anterior não fizemos uso de parâmetros, apenas do "this". Mas o método call pode receber a partir do segundo parâmeto (o primeiro sempre será o escopo que será atribuído ao this) os parâmetros que serão passados para a função.
var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(p1, p2){
console.log(this.url + ' - ' + p1 + ' - ' + p2);
}
f('aprendendo javascript', 'no andafter!');
f.call(site, 'estudando códigos', 'no desenvolvedor');
O método function.apply()
O método function.apply() tem o mesmo funcionamento do function.call() com uma diferença na forma dos parâmetros, o segundo parâmetro sempre deverá ser um array, contendo todos os parâmetros que serão enviados para a função.
O primeiro parâmetro continua sendo o escopo onde sua função será executada.
var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(p1, p2){
console.log(this.url + ' - ' + p1 + ' ' + p2);
}
f('aprendendo javascript', 'no andafter!');
f.apply(site, ['estudando códigos', 'no desenvolvedor']);
Agora você já sabe como definir em qual escopo uma função será executada, e também tem um facilitador para funções que chamam funções.
Este é um post introdutório para alguns códigos mais complexos que virão, quase todos resultados das minhas pesquisas de performance de javascript e desenvolvimento de bibliotecas como o jQuery Lazy Load.
Creio que a nomenclatura adequada seria “CONTEXTO”. Pois, o contexto referencia o valor do THIS.
fonte: https://stackoverflow.com/questions/14328519/different-in-scope-and-context-in-this-javascript-code