/// 返回一个函数,但是只要它一直持续地被调用,就不会被触发;除非它最后一次被调用停止了n毫秒
// 如果`immediate`参数被传递,那么会直接执行
function debounce(func, wait, immediate){
if(!immediate) func.apply(context, args);
var callNow = immediate && !timeout;
if(callNow) func.apply(context, args);
// clearTimeout非常关键。如果在timeout完成后later调用前,excuteFunction又被调用,那么timeou会被清除,并接下来被重新赋值开始
timeout = setTimeout(later, wait);