javascript - 为什么我得到 "Cannot read property of html undefined"?

标签 javascript closures

我正在构建一个简单的计数器来练习 JS 中的闭包,但我似乎无法克服这个错误。在我看来,将变量 elem 设置为 canv 的 id 应该可以,但显然有些东西没有连接。我在这里做错了什么?

我的 HTML:

<body>
  <div id="canv">

  </div>
</body>

我的JS:

function setup(delay) {
  var el = document.getElementById('canv');

  counterFn(el, delay);
}

function counterFn(el, delay) {
  var counter = 0;

  setInterval(getTime, delay);

  function getTime(el) {
    el.innerHTML(counter);
    counter++;
  }
}

setup(500);

这一切都感觉非常基本,但我似乎无法弄清楚我做错了什么。

这是一个 JS fiddle 。 https://jsfiddle.net/8sjaqdrh/2/

最佳答案

导致错误的原因是 el 没有在 getTime 范围内定义。

在 getTime 的父作用域 counterFn 中,定义了 el ,因为您在 counterFn(el, delay) 中调用它时给了它一个值setup 函数,即 el = document.getElementById('canv')

但是,在 getTime 范围内,您没有为 el 提供值。因此 el 变为 undefined

代码的另一个问题是 innerHTML 的使用不正确。

只需将参数从 function getTime(el){... 删除到 function getTime(){... 即可。

至于innerHTML,它不是一个函数。所以不能像 innerHTML(counter) 那样调用它。

正确的方法是直接为其赋值,如innerHTML = counter

function setup(delay) {
  var el = document.getElementById('canv');

  counterFn(el, delay);
}

function counterFn(el, delay) {
  var counter = 0;

  setInterval(getTime, delay);

  // Corrected code:
  function getTime() {
    el.innerHTML = counter;
    counter++;
  }
  
  /* Your code
  function getTime(el){
    el.innerHTML(counter);
    counter++;
  }
  */
}

setup(500);
<div id="canv"></div>

关于javascript - 为什么我得到 "Cannot read property of html undefined"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45380633/

相关文章:

javascript - 单击切换 fontawesome 图标,不起作用

swift - 如何通过 Swift 中的闭包设置惰性计算属性的值?

generics - Generic 类型的关闭参数 - 异常

ios - 当作为 Objective-C block 调用时,Swift 闭包崩溃

javascript - Cloudflare Workers Buffer.from()

javascript - Highcharts Areaspline - 突出显示悬停效果的列

javascript - 在 JavaScript 中使用 eval 运行一组闭包

ember.js - Ember 3+ 将 Action 从组件传递到 Controller 不起作用

javascript - 如何使用javascript动态创建单选按钮?

javascript - 奇怪的关闭行为