this.method 不是 setInterval 的函数 [重复]

2023-12-14

我有这个简单的代码:

var Modules = (function() {
    'use strict';

    return {
        
        TIMER: function (){
            var timer = null;
            
            return {
                time: 100,
                init: function() {
   
                    this.counter();
                    this.timer = window.setInterval(this.counter, 1000);
                },
                counter: function() {
                    this.time -= 1;

                    if (this.time <= 0) {
                        window.clearInterval(this.timer);
                        alert('Time expired');
                    }
                    console.log(this.time);
                    this.viewer();
                    
                },
                viewer: function() {
                    document.getElementById('timer').innerHTML = this.time;
                }
            }
        }
    };
}());

Modules.TIMER().init();
<div id="timer"></div>

出了点问题,因为我有两个错误:

this.viewer 不是一个函数

and

这次的 NaN

我的设计模式超出间隔运行有什么问题?

扩展TIMER后重置方法:

reset: function() {
                    this.time = 100;
                }

并在外部调用它:Modules.TIMER().reset(); ?

I got

this.time 未定义

.

或者在 init 内部:

jQuery("body").on('keyup mouseup', function (e) {
                        this.reset();
                    });

我收到错误:

this.reset() 不是函数。


您的问题来自这一行:

this.timer = window.setInterval(this.counter, 1000);

当您在调用回调时setInterval方法,将this回调函数中不再引用您的TIMER对象,但是window.


解决方案A:使用.bind(this)绑定词汇this回调

您需要将当前上下文绑定到回调:

this.timer = window.setInterval(this.counter.bind(this), 1000);
var Modules = (function() {
    'use strict';

    return {
        
        TIMER: function (){
            var timer = null;
            
            return {
                time: 100,
                init: function() {
   
                    this.counter();
                    this.timer = window.setInterval(this.counter.bind(this), 1000);
                },
                counter: function() {
                    this.time -= 1;

                    if (this.time <= 0) {
                        window.clearInterval(this.timer);
                        alert('Time expired');
                    }
                    console.log(this.time);
                    this.viewer();
                    
                },
                viewer: function() {
                    document.getElementById('timer').innerHTML = this.time;
                }
            }
        }
    };
}());

Modules.TIMER().init();
<div id="timer"></div>

解决方案B:使用ES6箭头函数setInterval打回来

注意:就我个人而言,我更喜欢这个解决方案,因为它使用 ES6,但如果您仍然支持旧版浏览器并且不想转译 JS,这可能不是最好的解决方案。

另一种选择是在回调中使用箭头函数setInterval,而不是分配this.counter直接作为回调函数:

this.timer = window.setInterval(() => this.counter(), 1000);

箭头函数保留了词法this,所以当this.counter()被调用时它将使用相同的上下文,即内部this将引用您的TIMER object.

var Modules = (function() {
    'use strict';

    return {
        
        TIMER: function (){
            var timer = null;
            
            return {
                time: 100,
                init: function() {
   
                    this.counter();
                    this.timer = window.setInterval(() => this.counter(), 1000);
                },
                counter: function() {
                    this.time -= 1;

                    if (this.time <= 0) {
                        window.clearInterval(this.timer);
                        alert('Time expired');
                    }
                    console.log(this.time);
                    this.viewer();
                    
                },
                viewer: function() {
                    document.getElementById('timer').innerHTML = this.time;
                }
            }
        }
    };
}());

Modules.TIMER().init();
<div id="timer"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

this.method 不是 setInterval 的函数 [重复] 的相关文章

随机推荐

  • 在哪里可以找到elasticache redis集群的TLS证书

    作为 Elasticache 的新手 我正在尝试从在不同 VPC 中运行的实例连接到它 当客户端位于基于 TLS 的 VPC 内时 它工作得很好 因为不需要传递 TLS 证书 我们只需要向 redis cli 传递 tls 选项 同样 当我
  • NSDate dateFromString 已弃用?

    我正在尝试使用 NSDate dateFromString 方法 但收到警告并且它导致应用程序崩溃 代码如下 NSString pickerDate NSString stringWithFormat timeSelector date N
  • 构建搜索应用程序的最佳实践? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很快将开始一个简单的数据存储和搜索项目 基本上 其中之一是 将我巨大的 Excel 电子表格放入数据库 为其构建一个 Web GUI 并使其可搜索 类型的东西 困扰我的一件事是当用户输入
  • 如何从街道地址获取坐标

    我正在开发 Windows Phone 8 应用程序 但我找不到如何从地址获取坐标 问题是 我有我的坐标 我需要计算我和某个地址之间的距离 Windows Phone 8 没有太多记录 所以请帮助我 您正在寻找的称为 地理编码 将地址转换为
  • Grails:在运行时更改 dataSource url 以实现多租户数据库分离

    我正在使用 Grails 构建一个多租户应用程序 并且我想保留单独的数据库 我需要在运行时动态更改 url 以将 GORM 指向不同的数据库 我有一个前端充当平衡器 将请求分发到后端主机集群 每个后端主机运行一个 Grails 2 3 5
  • String.Format 在 TypeScript 中不起作用

    String Format不适用于TypeScript Error The property format does not exist on value of type prototype String fromCharCode code
  • 使用 TCP 连接获取字节数组

    我正在使用UDP发送 接收数据 但我现在想切换到TCP以避免数据包丢失 我读过一些关于TCP并注意到 而不是像使用 DatagramPacketUDP TCP使用输入流 输出流 我们如何从 DataInputStream 获取 byte 类
  • WordPress主题中通过$.ajax调用外部url

    我的 WordPress 应用程序托管在 url 上http 127 0 0 1 wordpress 我在 WordPress 标头中添加了以下脚本来获取一些令牌 但它没有给出任何令牌 我复制了该网址 http 127 0 0 1 8090
  • 如何用 Objective C 杀死一个线程?

    我调用了一个第三方 C 库 我已将其放入其自己的线程中 当前使用 NSThread 我想让用户能够停止该线程的执行 我很清楚这可能会导致的所有问题 但我仍然希望这样做 根据Apple 的线程编程指南 Cocoa 有可能这样做 iPhone
  • STL 中 UTF8 与宽字符的转换

    是否可以以独立于平台的方式将 std string 中的 UTF8 字符串转换为 std wstring 反之亦然 在 Windows 应用程序中 我将使用 MultiByteToWideChar 和 WideCharToMultiByte
  • 为每个发布环境转换 Azure 网站部署的 web.config

    在 Visual Studio Team Services 以前的 Visual Studio Online 中 我有三个发布环境 每个环境都有一个 Azure 网站部署步骤 我可以通过指定获取 Web Uat config 的 Build
  • 使用 solr 索引维基百科转储

    我的机器上安装了 solr 3 6 2 与 tomcat 完美运行 我想使用 solr 索引维基百科转储文件 如何使用 DataImportHandler 执行此操作 还有其他办法吗 我对 xml 没有任何了解 我提到的文件解压后大小约为
  • Hadoop中多个reducer如何只输出一个part-file?

    在我的map reduce 作业中 我使用4 个reducer 来实现reducer 作业 因此 通过这样做 最终输出将生成 4 个部分文件 part 0000part 0001part 0002part 0003 我的问题是 尽管hado
  • 对角带中的遍历矩阵

    我认为这个问题有一个简单的解决方案 几个 for 循环和一些奇特的计数器 但显然它相当复杂 所以我的问题是 你将如何 用 C 语言 编写对角条中方阵的函数遍历 Example 1 2 3 4 5 6 7 8 9 必须按以下顺序遍历 1 2
  • 与 NSPersistentContainer 的核心数据并发

    NOTE 我看过类似的问题 但没有找到描述这种情况的问题 我正在查看 Apple 提供的有关核心数据并发性的以下示例代码 https developer apple com library content documentation Coc
  • Webpack 开发服务器由 nginx 代理的独立子域

    我目前陷入了 webpack dev server 的一个问题 它用错误的端口侦听错误的域 我已经对我的 Symfony 应用程序进行了 docker 化 它有 3 个容器 节点 php 和 nginx 在 Node 容器上 webpack
  • PHP SimpleXML:如何加载 HTML 文件?

    当我尝试使用以下命令将 HTML 文件加载为 XML 时simplexml load string我收到许多关于 HTML 的错误和警告 但它失败了 有没有办法使用 SimpleXML 正确加载 html 文件 该 HTML 文件可能包含不
  • 如何为 Redis 中的数据建模以获得复杂的数据结构?

    我参考了链接 http panuoksala blogspot com 2015 09 redis many to many html开发以下代码 我已经实现了一些代码 看起来到目前为止什么都无法实现 获取用户1组 hget User 1
  • 浮动 div 无法正确堆叠(没有间隙)

    我有一个容器 里面有很多漂浮的物品 问题是 当其中至少一个的大小发生变化时 就会出现间隙 有什么办法可以迫使他们填补这些空白吗 wpr padding 20px wpr span width 260px min height 130px b
  • this.method 不是 setInterval 的函数 [重复]

    这个问题在这里已经有答案了 我有这个简单的代码 var Modules function use strict return TIMER function var timer null return time 100 init functi