闭包 - 为什么这行代码是这样的?

时间:2015-01-14 12:14:30

标签: javascript

我正在看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);
        };
    },

1 个答案:

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