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 的函数 [重复] 的相关文章

  • Javascript树遍历算法

    我需要帮助以深度优先的方式遍历树结构 我无法想出一个算法来正确地做到这一点 我的输入是这样的 A B C 1 2 a b c d 输出应采用以下形式 A 1 a A 1 b A 1 c A 1 d A 2 a A 2 b A 2 c A 2
  • 使用 WMI 查找服务的依赖关系,然后区分依赖的服务和依赖的驱动程序

    MSDN 上有一个代码示例 它使用 WMI 枚举特定服务的所有依赖项 http msdn microsoft com en us library aa393673 v vs 85 aspx http msdn microsoft com e
  • 如何修复 Nuxt 中导航器/窗口/文档未定义的问题

    我试图确定 Nuxt 应用程序内的 UserAgent 和 Retina 信息 但应用程序抛出错误并显示导航 窗口未定义 我如何在 nuxt 应用程序中获取这些信息 const userAgent navigator userAgent t
  • javascript 使用 onclick 创建按钮

    我正在尝试使用 javascript 创建一个具有 onclick 事件的按钮 该事件调用 head 中定义的函数 该函数接收相对于按钮的 dom 对象作为参数 我该怎么做呢 ex
  • 单值或常量值时在 x 轴上绘制的样条图 - highchart

    while using the older version of highchart 2 1 6 if a plot had only one value or a series of same values it would plot a
  • 在javascript中使用“return !0”有什么意义吗?

    如果您转到谷歌结果页面并运行rwt toString 你会看到这个函数的返回调用是 return 0 我想不出任何理由为什么这不会总是如此true 这只是一个简写吗true 还是还有更多事情发生 总是如此 但下载需要 2 个字节 0是 2
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • 在 asp.net vb 中通过第一个下拉列表值填充第二个下拉列表

    我在使用 asp net vb 时遇到了一些问题 我想做的是有2个下拉框 第一个下拉菜单将有 1 2 3 例如 第二个下拉菜单将有 A 乙 C 默认情况下 但是 如果选择 1 我希望第二个下拉菜单自动选择 c 我不知道 JavaScript
  • jQuery 的 css() 在应用于滚动事件时滞后

    我正在尝试实现一个简单的 固定标题 表 我知道这在理论上只能用 CSS 来完成 但是当涉及到 OSX Lion 及其消失的滚动条时 它效果不佳 所以我用 jQuery 来做 方法很简单 只有1 5行代码 inbox scroll funct
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • Telegram 授权无默认按钮

    使用 Telegram 第 3 方授权的唯一有记录的方法是使用其提供的脚本https core telegram org widgets login https core telegram org widgets login 这个脚本 正如
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne

随机推荐

  • 在哪里可以找到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