为什么每次调用此函数时都不将该值设置为 null?

S·巴拉德

有人可以向我解释为什么每次调用函数时都不会将 lastEventTimestamp 重置为 null 吗?

Function.prototype.throttle = function (milliseconds, context) {
    var baseFunction = this,
        lastEventTimestamp = null,
        limit = milliseconds;

    return function () {
        var self = context || this,
            args = arguments,
            now = Date.now();

        if (!lastEventTimestamp || now - lastEventTimestamp >= limit) {
            lastEventTimestamp = now;
            baseFunction.apply(self, args);
        }
    };
};
特里科特

当您调用油门时,会创建一个新的闭包,其中lastEventTimestamp被定义为null内部函数有一个对那个变量的引用,所以当这个函数被返回时,闭包仍然有一个对它的引用,并保持它的状态:

function test() {
}

var myTest = test.throttle(100);

myTest();
myTest();

然后,当您重复调用函数myTest —— 返回的 —— 时,它将作用于lastEventTimestamp变量的同一个实例请注意,调用该函数不会执行赋值lastEventTimestamp = null,而只会执行该内部函数体中的代码。所以确实没有理由应该重置该变量。它在调用之间保持其状态。这就是JavaScript 中闭包力量

查看console.log此代码段中执行了哪些调用:

Function.prototype.throttle = function (milliseconds, context) {
    console.log('initialising throttle');
    var baseFunction = this,
        lastEventTimestamp = null,
        limit = milliseconds;

    return function () {
        console.log('running throttle wrapper function');
        var self = context || this,
            args = arguments,
            now = Date.now();

        if (!lastEventTimestamp || now - lastEventTimestamp >= limit) {
            lastEventTimestamp = now;
            console.log('calling original function');
            baseFunction.apply(self, args);
        }
    };
};

function test() {
    console.log('running test');
}

var myTest = test.throttle(100);

myTest();
myTest(); // runs too soon, so test is not called.

请注意如何'running throttle wrapper function'在输出中只出现一次。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么每次调用不同的函数时 <null> 都会出现?

来自分类Dev

为什么当捆绑mMap获得此值时,为什么Bundle中的getExtra()为null?

来自分类Dev

为什么在函数调用后没有将此对象设置为NULL?

来自分类Dev

调用函数时无法将属性'innerHTML'设置为null

来自分类Dev

调用函数时将参数设置为null

来自分类Dev

为什么需要在move构造函数中将右值引用设置为null?

来自分类Dev

进入函数调用堆栈时,此指针设置为null-在gdb下使用Google Test进行时

来自分类Dev

将不可为空的值设置为null时,为什么TypeScript没有警告?

来自分类Dev

从Webhook调用Runbook时,为什么WebhookData为null?

来自分类Dev

为什么此委托变量为null?

来自分类Dev

为什么此对象为null?

来自分类Dev

为什么此ListView为null?

来自分类Dev

为什么此TextView为null?

来自分类Dev

为什么当我向 SQLite 数据库插入值时,这些值被设置为 null?

来自分类Dev

为什么此字符串的值为null,但是如果我检查是否为null,则结果为false?

来自分类Dev

为什么当使用GET方法调用时,此全局列表重置为null?

来自分类Dev

为什么productsCenter变量的值为null?

来自分类Dev

当存储该引用的局部变量设置为null时,为什么静态变量没有设置为null?

来自分类Dev

为什么Typescript不鼓励将设置值设置为null?

来自分类Dev

为什么此呼叫中的服务为null?

来自分类Dev

为什么在FireBase查询块中此NSString为null?

来自分类Dev

为什么此环境变量始终为null?

来自分类Dev

为什么在MySQL中为null <> null = null

来自分类Dev

为什么在MySQL中为null <> null = null

来自分类Dev

为什么此SQL顺序null值持续存在?

来自分类Dev

为什么需要在move构造函数中将rvalue引用设置为null?

来自分类Dev

为什么`NOT(NULL=NULL)` 是假的?

来自分类Dev

在析构函数中缺少ptr = NULL导致错误,将ptr设置为NULL可以正常工作。为什么?

来自分类Dev

为什么EJB为null?

Related 相关文章

  1. 1

    为什么每次调用不同的函数时 <null> 都会出现?

  2. 2

    为什么当捆绑mMap获得此值时,为什么Bundle中的getExtra()为null?

  3. 3

    为什么在函数调用后没有将此对象设置为NULL?

  4. 4

    调用函数时无法将属性'innerHTML'设置为null

  5. 5

    调用函数时将参数设置为null

  6. 6

    为什么需要在move构造函数中将右值引用设置为null?

  7. 7

    进入函数调用堆栈时,此指针设置为null-在gdb下使用Google Test进行时

  8. 8

    将不可为空的值设置为null时,为什么TypeScript没有警告?

  9. 9

    从Webhook调用Runbook时,为什么WebhookData为null?

  10. 10

    为什么此委托变量为null?

  11. 11

    为什么此对象为null?

  12. 12

    为什么此ListView为null?

  13. 13

    为什么此TextView为null?

  14. 14

    为什么当我向 SQLite 数据库插入值时,这些值被设置为 null?

  15. 15

    为什么此字符串的值为null,但是如果我检查是否为null,则结果为false?

  16. 16

    为什么当使用GET方法调用时,此全局列表重置为null?

  17. 17

    为什么productsCenter变量的值为null?

  18. 18

    当存储该引用的局部变量设置为null时,为什么静态变量没有设置为null?

  19. 19

    为什么Typescript不鼓励将设置值设置为null?

  20. 20

    为什么此呼叫中的服务为null?

  21. 21

    为什么在FireBase查询块中此NSString为null?

  22. 22

    为什么此环境变量始终为null?

  23. 23

    为什么在MySQL中为null <> null = null

  24. 24

    为什么在MySQL中为null <> null = null

  25. 25

    为什么此SQL顺序null值持续存在?

  26. 26

    为什么需要在move构造函数中将rvalue引用设置为null?

  27. 27

    为什么`NOT(NULL=NULL)` 是假的?

  28. 28

    在析构函数中缺少ptr = NULL导致错误,将ptr设置为NULL可以正常工作。为什么?

  29. 29

    为什么EJB为null?

热门标签

归档