Javascript Underline.js debounce函数中的内部函数上下文
我正在试图理解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
_.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,则全局变量将递增,尽管对象具有相关属性。