ReferenceError:在Joomla模块中未定义count_1

时间:2016-09-14 15:36:21

标签: javascript setinterval referenceerror

这是我的剧本:

<script>
  document.addEventListener("DOMContentLoaded", function(event) {
    var START_DATE_1 = new Date("July 18, 2016 10:30:00"); // put in the starting date here
    var INTERVAL_1 = 3; // in seconds
    var INCREMENT_1 = 1; // increase per tick
    var START_VALUE_1 = 0; // initial value when it's the start date
    var count_1 = 0;

    var msInterval_1 = INTERVAL_1 * 1000;
    var now_1 = new Date();
    count_1 = parseInt((now_1 - START_DATE_1)/msInterval_1) * INCREMENT_1 + START_VALUE_1;
    document.getElementById('counter_1').innerHTML = count_1;
    setInterval("count_1 += INCREMENT_1; document.getElementById('counter_1').innerHTML = count_1;", msInterval_1);
  });
</script>

我把它放在Joomla模块中。 Firebug说:&#34; ReferenceError:count_1未定义&#34;

为什么呢?我该如何解决?

2 个答案:

答案 0 :(得分:3)

您应该将函数而不是字符串传递给setInterval调用。传递字符串时,它在全局范围内执行,count_1变量仅存在于传递给addEventListener的回调函数的范围内。

<script>
  document.addEventListener("DOMContentLoaded", function(event) {
    var START_DATE_1 = new Date("July 18, 2016 10:30:00"); // put in the starting date here
    var INTERVAL_1 = 3; // in seconds
    var INCREMENT_1 = 1; // increase per tick
    var START_VALUE_1 = 0; // initial value when it's the start date
    var count_1 = 0;

    var msInterval_1 = INTERVAL_1 * 1000;
    var now_1 = new Date();
    count_1 = parseInt((now_1 - START_DATE_1)/msInterval_1) * INCREMENT_1 + START_VALUE_1;
    document.getElementById('counter_1').innerHTML = count_1;
    setInterval(function() {
      count_1 += INCREMENT_1;
      document.getElementById('counter_1').innerHTML = count_1;
    }, msInterval_1);
  });
</script>

答案 1 :(得分:0)

当你传入一个字符串作为定时器函数的第一个参数时,它们实际上创建了一个脚本对象,并将其作为源:

  

<强> [否则]

     

执行HostEnsureCanCompileStrings(callerRealm,calleeRealm)。如果这会抛出异常,则报告异常。

     

让脚本源成为第一个方法参数。

     

让设置对象成为方法上下文的环境设置对象。

     

让脚本成为使用脚本源和设置对象创建经典脚本的结果。

     

运行经典脚本脚本。

https://html.spec.whatwg.org/multipage/webappapis.html#dom-setinterval

因此,它与您实际访问函数范围的eval不完全相同。脚本对象应该可以访问全局范围。它失败的原因是因为它通过count_1查找全局范围内的count_1 += INCREMENT,但找不到ReferenceError

避免此类错误的最佳方法是不使用字符串作为计时器函数的参数。