【问题标题】:Why does javascript new object in cycle returns the last created and not one for each JSON inside of an array? [duplicate]为什么循环中的javascript新对象返回最后创建的对象,而不是数组中每个JSON的返回对象? [复制]
【发布时间】:2015-02-14 00:56:18
【问题描述】:

我正在尝试为包含 JSON 对象的数组的所有位置创建一个新对象作为 JSON 的属性,但问题是当运行它时,它总是打印出最后一个也是最后一个在内部创建的对象为循环。 我想不通这个... 谁能解释我为什么会这样? 这是我的代码:

for(var i = 0; i < data.length; i++){

        var clock = new Clock((datesService.parseToClock(data[i].endsAt) / 1000), data[i].id)
        data[i].clock = clock
        data[i].interval = setInterval(function(){
          clock.decrement()
          console.log('ID: ' +clock.getAuction() + ' | ' + clock.getDays()+' d '+ clock.getHours()+' h ' + clock.getMinutes() + ' m ' + clock.getSeconds())
        }, 1000)

      }
function Clock(tempo, auction){
  this.auction = auction
  this.tempo   = tempo
  this.seconds = this.tempo % 60
  this.minutes = (this.tempo / 60) % 60
  this.hours   = ((this.tempo / 60) / 60) % 24
  this.days    = (((this.tempo / 60) / 60) / 24)
}

Clock.prototype.decrement = function(){
  this.tempo --
  this.seconds = Math.floor(this.tempo % 60)
  this.minutes = Math.floor((this.tempo / 60) % 60)
  this.hours   = Math.floor(((this.tempo / 60) / 60) % 24)
  this.days    = Math.floor((((this.tempo / 60) / 60) / 24))
};

Clock.prototype.getAuction = function(){
  return this.auction
};

Clock.prototype.getDays = function(){
  return this.days
};

Clock.prototype.getHours = function(){
  return this.hours
};

Clock.prototype.getMinutes = function(){
  return this.minutes
};

Clock.prototype.getSeconds = function(){
  return this.seconds;
};

只是不明白为什么... 谢谢大家:)

【问题讨论】:

  • 感谢您提出这个问题,您帮助我学习了 JS!

标签: javascript arrays json object javascript-objects


【解决方案1】:

这将很快作为重复问题关闭。关键问题是代码顶部的变量“clock”在所有间隔计时器处理程序之间共享。 JavaScript 范围始终处于函数级别。解决方法是使用 另一个 函数来构建间隔计时器处理程序。

【讨论】:

    【解决方案2】:

    是的.. 这是因为您在循环中创建了“时钟”变量,所以每次都会重置,当循环结束时,“时钟”等于它设置的最后一个值。在您设置的间隔函数中,它引用全局时钟变量,因此它的每个版本都将具有相同的(最后一个)值。

    当你创建一个像 setInterval 中的匿名函数时,它不会在你的 for 循环的上下文中运行,而是在全局范围内运行,因此会造成变量混淆。

    你需要引用对象的时钟属性,而不是函数本地的时钟变量..

    我可能没有很好地解释这一点,但谷歌“javascript 匿名函数”或“var that = this”因为这是解决此类问题的最常用方法。

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多