Function.prototype.bind – é uma ótima função que pode ajudá-lo a limpar seu código. Vejo alguns exemplos comuns, quando é útil. Primeiro são funções como moveUp / moveDown, aumentaValue / diminuiValue etc. Exemplo abstrato:
$arrowUp.on('click', function(){
currentPosition += 1;
applyChanges();
});
$arrowDown.on('click', function(){
currentPosition -= 1;
applyChanges();
});
Vamos simplificar este código usando .bind
:
function move(diff) {
currentPosition += diff;
applyChanges();
};
$arrowUp.on('click', move.bind(null, 1));
$arrowDown.on('click', move.bind(null, -1));
Parece melhor, certo?
O segundo exemplo é a chamada de função com parâmetros em callbacks. Por exemplo, setTimeout / setInterval:
$(window).load(function(){
setTimeout(loadSomething, 5000);
});
Podemos usar bind e alterá-lo para uma linha:
$(window).load(setTimeout.bind(null, loadSomething, 500));
Outro exemplo do angular.js. Queríamos armazenar algumas preferências do usuário em localStorage e o código era como:
$scope.$watch('language', function(value){
$localStorage.set('language', value);
});
$scope.$watch('timezone', function(value){
$localStorage.set('timezone', value);
});
...
E nós o refatoramos:
$scope.$watch('language', $localStorage.set.bind(null, 'language'));
$scope.$watch('timezone', $localStorage.set.bind(null, 'timezone'));
...
É mais fácil de ler, tem uma aparência melhor e torna seu código menor.
E não se esqueça de adicionar polyfill para navegador antigo para usar esta função!