Javascript Underline.js debounce函数中的内部函数上下文

Javascript Underline.js debounce函数中的内部函数上下文,javascript,function,underscore.js,debouncing,Javascript,Function,Underscore.js,Debouncing,我正在试图理解Underline.js debounce函数的机制: 以下是其本机代码: _.debounce = function(func, wait, immediate) { var timeout, args, context, timestamp, result; var later = function() { var last = _.now() - timestamp; if (last < wait && l

我正在试图理解Underline.js debounce函数的机制:

以下是其本机代码:

_.debounce = function(func, wait, immediate) {
    var timeout, args, context, timestamp, result;

    var later = function() {
      var last = _.now() - timestamp;

      if (last < wait && last > 0) {
        timeout = setTimeout(later, wait - last);
      } else {
        timeout = null;
        if (!immediate) {
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        }
      }
    };

    return function() {
      context = this;
      args = arguments;
      timestamp = _.now();
      var callNow = immediate && !timeout;
      if (!timeout) timeout = setTimeout(later, wait);
      if (callNow) {
        result = func.apply(context, args);
        context = args = null;
      }

      return result;
    };
  };
\uu0.debounce=函数(func、wait、immediate){
变量超时、参数、上下文、时间戳、结果;
var later=function(){
var last=\ uu0.now()-时间戳;
if(last0){
超时=设置超时(稍后,等待-最后一次);
}否则{
超时=空;
如果(!立即){
结果=函数应用(上下文,参数);
如果(!timeout)context=args=null;
}
}
};
返回函数(){
上下文=这个;
args=参数;
时间戳=u.now();
var callNow=立即&&!超时;
如果(!timeout)timeout=setTimeout(稍后,等待);
如果(立即呼叫){
结果=函数应用(上下文,参数);
上下文=args=null;
}
返回结果;
};
};
我遇到的问题是内部可返回函数中使用的上下文变量。我不明白我们为何要在这里使用它,以及它所包含的内容。 我尝试在不应用任何上下文的情况下,将同一个函数与去Bounced函数的简单调用一起使用,而且效果也很好。 这是我的小提琴,它有两个功能:


那么,这里的上下文是必要的吗?需要应用什么上下文?

上下文是调用函数的取消公告版本的
。如果我们对一个对象进行去Bouncing方法,那么我们将使用
对象调用它。去Bouncing_函数
,但我们希望使用与
this
相同的对象调用原始函数

如果取消绑定的函数不是对象方法,或者在调用时没有使用this
,那么上下文将为null或
window
或其他内容,并且原始函数将使用this
调用,但没有人会在意


我假设您理解
函数#apply
方法,该方法调用具有特定上下文(
this
)和一组参数的函数。

您能给出具体示例吗? 这是我的密码,但是 1.应用(上下文,args); 2.func(); 他们的安慰是一样的,但他们不应该

函数去盎司(func,wait,immediate){
//例如,“private”变量
//由于关闭,返回的函数将能够引用它。
//对返回函数的每次调用都将共享此公用计时器。
var超时;
这个a=222;
//调用debounce返回一个新的匿名函数
返回函数(){
//引用setTimeout函数的上下文和参数
var context=this,
args=参数;
//是否现在调用该函数?如果immediate为true
//而且还没有超时,那么答案是:是的
var callNow=立即&&!超时;
//这是基本的去盎司行为,你可以称之为
//函数多次运行,但只执行一次
//[实施延迟之前或之后]。
//每次调用返回的函数时,计时器都会重新启动。
clearTimeout(超时);
//设置新的超时
timeout=setTimeout(函数(){
//在timeout函数中,清除timeout变量
//这将使下一次执行在“立即”模式下运行
超时=空;
//检查函数是否已使用immediate标志运行
如果(!立即){
//使用apply调用原始函数
//apply用于定义“this”对象以及参数
//(都是在设置超时之前捕获的)
函数应用(上下文,参数);
func();
}
},等等);
//立即模式和无等待定时器?执行该功能。。
if(callNow)funct.apply(上下文,参数);
}
}
功能测试(){
这个。a=100;
这个b=200;
}
test.prototype.m1=函数(){
console.log(“m1”,this.a);
}
var tt=新测试();
去盎司(tt.m1,1000)();

@torazuburo,非常感谢。当我测试这个函数时,我只专注于全局函数的去抖动,而不考虑其他用例。现在我明白了,如果我们想要对obect方法进行去Bounce,那么上下文对于保持绑定到对象是必要的。否则,函数将始终采用窗口对象上下文。下面是下划线函数和关闭上下文的附加参数。如果为true,则全局变量将递增,尽管对象具有相关属性。