我正在看Leaflet api。
有没有理由在setTimeout中调用wrapperFn.apply(context, args);
而不是fn.apply(context, args);
?
我试了一下,它给了我相同的输出。但是想知道它是否有意义呢?
function a(fn, time, context) { var lock, execOnUnlock; return function wrapperFn() { var args = arguments; if (lock) { execOnUnlock = true; return; } lock = true; setTimeout(function () { lock = false; if (execOnUnlock) { wrapperFn.apply(context, args); execOnUnlock = false; } }, time); fn.apply(context, args); }; },
答案 0 :(得分:2)
该函数为函数创建一个包装器,该函数是第一个参数,只能以第二个参数指定的间隔执行。如果您在间隔内再次呼叫一次或多次,则最后一次呼叫将在间隔后自动执行。
var f = a(someFunction, 1000, {});
f(1); // this will execute the function
f(2); // this will not be executed
f(3); // this will be executed after a second
setTimeout(function(){
f(4); // this will be executed a half second later (two seconds after the first)
}, 1500);
在间隔结束时自动进行的呼叫将锁定该功能另一个时间间隔。如果代码将调用fn
而不是wrapperFn
,则该调用将不会被锁定,您可以在该间隔内再次调用该函数。例如:
var f = a(someFunction, 1000, {});
f(1); // this will execute the function
f(2); // this will not be executed
f(3); // this will be executed after a second
setTimeout(function(){
f(4); // this would be executed immediately (1.5 seconds after the first)
}, 1500);