当前位置: 首页 > 知识库问答 >
问题:

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

艾宏远
2023-03-14

我正在看宣传单。

在setTimeout中调用wrapperFn.apply(context,args)有什么原因吗 和非fn.apply(上下文,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个答案

颛孙信厚
2023-03-14

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

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);
 类似资料:
  • 为什么jaxb在下面生成一个名为的类型参数? 这个文件是由JavaTM体系结构用于XML绑定(JAXB)参考实现生成的: 也许这是一个我不知道的设计模式?

  • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 问题内容: 如果你给 它没有编译,但是带有花括号的相同代码是: 有什么解释? 问题答案: 基本上,变量声明只能在块中声明。 查看 Java语言规范中“语句”的语法 -它包括Block,但不包括LocalVariableDeclarationStatement- 后者是block语法的一部分。 这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为

  • 我想知道为什么下面的代码: 我被要求详细解释,但我不明白为什么输出是这样的。请有人帮帮我。