gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:49:29 25 4
gpt4 key购买 nike

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

最佳答案

该函数为第一个参数的函数创建了一个包装器,它只能在第二个参数指定的时间间隔内执行。如果您在间隔内再次调用它一次或多次,最后一次调用将在间隔后自动执行。

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

关于javascript - 闭包——为什么这一行代码是这样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com