您好,我似乎无法弄清楚为什么将反跳功能直接传递给keyup事件时会按预期工作;但是如果我将其包装在匿名函数中则无法使用。
我有这个问题的小提琴:http : //jsfiddle.net/6hg95/1/
编辑:添加了所有我尝试过的东西。
的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
并且noReturnAnonFunction
不触发反跳功能;但是最后一个function
会开火。我不明白为什么会这样。有人可以帮我理解吗?
编辑
好,所以在#exeDebouncedFunc(您引用的那个)中不发生反跳的原因是因为该函数是在匿名函数的范围内执行的,另一个keyup事件将在另一个匿名范围内创建一个新函数;从而在您键入某些内容时多次触发去抖动功能(而不是一次触发,这是预期的行为;请参见#function
)。
能否请您解释之间的差异#anonFunction
和#function
。这又是一个范围界定问题的原因,为什么其中一个起作用而另一个不起作用?
编辑 好的,现在我知道为什么会这样了。这就是为什么我需要将其包装在匿名函数中的原因:
小提琴: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/>');
}
})();
$('#function').on('keyup', _.debounce(debounceIt, 500, false)); //This is working.
是: 为什么要去抖动返回功能。像这样美丽,而Just Makes Sense™