当我正在研究的项目中发生滚动事件时,我遇到了一些性能问题,并发现对这些问题进行去除是一个可行的解决方案:
jQuery(document).ready(function() {
jQuery(window).on('scroll', debounce(function(e) {
console.log('debounced');
console.log(e); // will print the corresponding jQuery object
// some heavy work
}, 250, true)
);
});
function debounce(func, wait, immediate) {
var timeout;
return function() {
var obj = this, args = arguments;
if (timeout) clearTimeout(timeout);
else if (immediate) func.apply(obj, args);
timeout = setTimeout(function() {
if (!immediate) func.apply(obj, args);
timeout = null;
}, wait || 100);
};
};
我的问题是,如何在debounce()中正确移交jQuery事件对象? 它不应该作为函数集的第一个参数传递给处理程序,这里是debounce()吗?
这个解决方案似乎很好地完成了工作,但是我在这里缺少一些概念性的东西吗?
注意:对于去抖动功能<{3}}的信用
答案 0 :(得分:2)
答案是jquery事件获得了debounce函数的返回,作为回报,它具有匿名函数,因此它很明显地想要获取参数。
var exampleFunc=function(){
return 1;
};
var a = exampleFunc; //a is exampleFunc reference
a= exampleFunc(); // a is return value of exampleFunc = 1
一些例子表明了同样的行为:
$('el').on("click",function(e){ /* do something */ })
与
相同someFunc=function(){ /* do something */ };
$('el').on("click",someFunc);
并且是一样的:
someFunc=function(){ /* do something */ };
someFunc2=function(){ /* do something 2 */ return someFunc; };
$('el').on("click",someFunc2());
和...一样:
someFunc2=function(){
/* do something 2 */
return function(){ /* do something */ }
};
$('el').on("click",someFunc2());
结论 - 在next函数中使用函数正在使用其返回值。
var a=5;
var getA(){ return 5; };
var twentyfive=a*getA(); //25
使用函数return作为另一个函数的一些示例:
//EXAMPLE NESTED FUNCTION
var funcNested=function(){
console.log("It is funcNested ");
};
var func=function(){ return funcNested; };
$("#test").on("click",func());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="test">Click me</button>