call, apply e bind
[ powerful features in javascript ]

Se você leu os artigos anteriores, aprendeu que, em JavaScript, tudo é um objeto. Ou seja, podemos acessar e definir propriedades adicionais para funções. A pergunta é, como?
Mas antes, você deve conhecer e dominar uma propriedade chamada this.
O que é?
Um estado interno de um determinado contexto. Em outras palavras: um coringa!
Onde é usada?
Dentro de uma função.
O que ela faz?
Faz referencia ao contexto do objeto que é invocado.
Apesar de, extremamente poderoso, é considerado uma má pratica usá-lo.
Dito isso, irei mostrar outra solução para manipulá-lo com: call, apply e bind.
O que são ?
Métodos de funções.
O que fazem?
Alteram o valor de this.
Call
O método call() invoca uma função com um dado valor this e argumentos passados individualmente.
fun.call(thisArg[, arg1[, arg2[, ...]]])
O primeiro parâmetro que recebe é o valor de this que que será atribuído à função. Os demais parâmetros são os parâmetros da função que invoca o método Call.

Apply
O método apply() chama uma função com um dado valor this e argumentos providos como uma array (ou um objeto parecido com um array).
fun.apply(thisArg, [argsArray])
Ele funciona exatamente como o método Call, porém, seu segundo parâmetro recebe um array de parâmetros.

Bind
Ao contrário dos outros, o método bind() não executa uma função, mas retorna uma outra com um novo contexto. O primeiro argumento recebe o valor do this a ser usado na função, e os demais argumentos são os parâmetros que terão valores atribuídos dentro da mesma.
fun.bind(thisArg[, arg1[, arg2[, ...]]])
Ele também tem a capacidade de alterar a quantidade de argumentos de uma função -ou seja, Currying.

