jQuery事件对象是否可以从事件处理程序内的匿名函数中获取?

时间:2016-08-04 22:19:02

标签: javascript jquery

当我正在研究的项目中发生滚动事件时,我遇到了一些性能问题,并发现对这些问题进行去除是一个可行的解决方案:

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}}的信用

1 个答案:

答案 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>