debounce do lodash não funciona em função anônima
Olá Não consigo descobrir por que a função debounce funciona como esperado quando passada diretamente para um evento de keyup; mas não funcionará se eu o envolver dentro de uma função anônima.
Eu tenho um violino do problema:http://jsfiddle.net/6hg95/1/
EDIT: Adicionado todas as coisas que eu tentei.
HTML
<input id='anonFunction'/>
<input id='noReturnAnonFunction'/>
<input id='exeDebouncedFunc'/>
<input id='function'/>
<div id='output'></div>
JAVASCRIPT
$(document).ready(function(){
$('#anonFunction').on('keyup', function () {
return _.debounce(debounceIt, 500, false); //Why does this differ from #function
});
$('#noReturnAnonFunction').on('keyup', function () {
_.debounce(debounceIt, 500, false); //Not being executed
});
$('#exeDebouncedFunc').on('keyup', function () {
_.debounce(debounceIt, 500, false)(); //Executing the debounced function results in wrong behaviour
});
$('#function').on('keyup', _.debounce(debounceIt, 500, false)); //This is working.
});
function debounceIt(){
$('#output').append('debounced');
}
anonFunction
enoReturnAnonFunction
não dispara a função debounce; mas o ultimofunction
dispara. Eu não entendo por que isso é. Alguém pode me ajudar a entender isso?
EDITAR Ok, o motivo pelo qual a rejeição não ocorre em #exeDebounceFunc (a que você se refere) é porque a função é executada no escopo da função anônima e outro evento de keyup criará uma nova função em outro escopo anônimo; assim, disparando a função rejeitada tantas vezes quanto você digita alguma coisa (em vez de disparar uma vez que seria o comportamento esperado; consulte o beviour de#func,tion
)?
Você pode, por favor, explicar a diferença entre#anonFunction
e a#function
. É novamente uma questão de definir por que um deles funciona e o outro não?
EDITAR Ok, agora entendo por que isso está acontecendo. E aqui está o porquê eu precisava envolvê-lo em uma função anônima:
Violino:http://jsfiddle.net/6hg95/5/
HTML
<input id='anonFunction'/>
<div id='output'></div>
JAVASCRIPT
(function(){
var debounce = _.debounce(fireServerEvent, 500, false);
$('#anonFunction').on('keyup', function () {
//clear textfield
$('#output').append('clearNotifications<br/>');
debounce();
});
function fireServerEvent(){
$('#output').append('serverEvent<br/>');
}
})();