[解決済み] 無名関数でロダッシュのデバウンスが機能しない
質問
hello debounce関数が、キーアップイベントに直接渡されると期待通りに動作するのに、無名関数でラップすると動作しないのはなぜなのかがわかりません。
問題のフィドルを持っています。 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
は実行されます。私はこれがなぜであるか理解できません。誰かこれを理解するのを助けることができますか?
EDIT
OK、では#exeDebouncedFunc (あなたが参照するもの) でデバウンスが起こらない理由は、関数が匿名関数のスコープで実行され、別のキーアップイベントが別の匿名スコープに新しい関数を作成するからです。したがって何かを入力すると何度でもデバウンスされた関数が起動します (しかし、期待通りの動作であるはずの起動は一度ではなく、次のビビア参照。
#function
)?
との違いを教えてください。
#anonFunction
と
#function
. 片方が動いてもう片方が動かないのはこれまたスコープの問題なのでしょうか?
EDIT OK、それでなぜこれが起こるか理解しました。そして、なぜ私がそれを無名関数内にラップする必要があったのかがここにあります。
フィドル 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/>');
}
})();
どのように解決するのですか?
パルパティムが説明したように、その理由は、以下の事実にあります。
_.debounce(...)
は関数を返し、それが呼び出されたときに魔法をかけるからです。
したがって、あなたの
#anonFunction
の例では、キーリスナーがあり、呼び出されると呼び出し元に関数を返すだけで、イベントリスナーからの戻り値には何もしません。
のスニペットです。
_.debounce(...)
の定義の一部です。
_.debounce
function (func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
if (immediate && !timeout) func.apply(context, args);
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
キーイベントのリスナーは
_.debounce(...)
あるいは、匿名でない例と同じように、返された関数を
_.debounce(...)
の呼び出しから返された関数をイベントリスナーとして使用することもできます。
関連
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] カプセル化された匿名関数の構文について説明します。
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] 文字列が空白であるかどうかをチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?