Javascript 一个有效的函数突然变成了;“不是一个函数”;当setInterval()运行另一个函数时

Javascript 一个有效的函数突然变成了;“不是一个函数”;当setInterval()运行另一个函数时,javascript,function,setinterval,Javascript,Function,Setinterval,tl;dr:当我让setInterval()每隔3秒运行另一个函数时,我的函数没有运行 我正在制作一个基于文本的园艺游戏,输入plant时运行“plant()”。我还有一个setInterval(updatePlots,3000)正在运行 这两个函数本身都可以正常工作,但是当我尝试在setInterval()运行时运行plant()时,会出现错误uncaughttypeerror:plant不是函数 (我知道这是setInterval(),因为我在没有运行它的情况下测试了种植,而且效果很好。)

tl;dr:当我让setInterval()每隔3秒运行另一个函数时,我的函数没有运行

我正在制作一个基于文本的园艺游戏,输入plant时运行“plant()”。我还有一个setInterval(updatePlots,3000)正在运行

这两个函数本身都可以正常工作,但是当我尝试在setInterval()运行时运行plant()时,会出现错误
uncaughttypeerror:plant不是函数

(我知道这是setInterval(),因为我在没有运行它的情况下测试了种植,而且效果很好。)

我尝试的(没有成功):


我真的不确定我要展示什么代码,因为这似乎比单行错误更像是一个基本问题。。。但是在这里

function updatePlots() {
  fullplots = [];
  for (i = 0; i < plots.length; i++) {
    if (plots[i].length) {
      fullplots.push(i);
    }
  }

  for (i = 0; i < fullplots.length; i++) {
    plant = plots[fullplots[i]][0];
    status = plots[fullplots[i]][1];
    growth = plots[fullplots[i]][2];

    if (growth < 100) {
        plots[fullplots[i]][2]++;
    }
  }

  if (document.getElementById('plots').style.display == 'block') {
    getPlots();
  }
}

...

function processTwo(command, a) {
  if (command == 'plant') {
    clearInterval(timer);
    console.log('about to plant 1'+a);
    plant(1, a);
    var timer = setInterval(updatePlots, 3000);
  }
  else { createError() }
}
函数updatePlots(){
fullplots=[];
对于(i=0;i
更新:解决

函数updatePlots(){
function updatePlots() {
  // this way, the global plant function is not overwritten
  // @see JavaScript variable scope
  var plant;
  // You might want to 'var' your other local (?) variables, too
  // var fullplots, i, status, growth;
  fullplots = [];
  for (i = 0; i < plots.length; i++) { //get fullplots
    if (plots[i].length) {
      fullplots.push(i);
    }
  }

  for (i = 0; i < fullplots.length; i++) {
    // at this line of code you overwrite the global plant, which is not a function anymore then
    plant = plots[fullplots[i]][0];
    status = plots[fullplots[i]][1];
    growth = plots[fullplots[i]][2];

    if (growth < 100) { //increment
        plots[fullplots[i]][2]++;
    }
  }

  if (document.getElementById('plots').style.display == 'block') {
    getPlots();
  }
}
//这样,全局工厂功能不会被覆盖 //@请参阅JavaScript变量范围 变种植物; //您可能还想“var”其他局部(?)变量 //var fullplots,i,状态,增长; fullplots=[]; 对于(i=0;i
函数updatePlots(){
//这样,全局工厂功能不会被覆盖
//@请参阅JavaScript变量范围
变种植物;
//您可能还想“var”其他局部(?)变量
//var fullplots,i,状态,增长;
fullplots=[];
对于(i=0;i
问题出现在setInterval调用的updatePlots方法中。你在那里做的是给“工厂”赋值


然后,当调用plant时,它会指向您在UpdatePlot中分配给它的新值,而不是原来的函数。您必须在UpdatePlot中声明一个新变量,以避免更改plant方法。我会用另一个名字来避免混淆

问题出现在setInterval调用的updatePlots方法中。你在那里做的是给“工厂”赋值


然后,当调用plant时,它会指向您在UpdatePlot中分配给它的新值,而不是原来的函数。您必须在UpdatePlot中声明一个新变量,以避免更改plant方法。我会用另一个名字来避免混淆

如果你愿意,请在问题本身中发布与问题相关的所有代码-不要将其隐藏在链接后面。你不应该告诉那些想帮忙的潜在帮手,他们必须在异地工作,只是为了了解你在做什么。如果链接中断,这个问题可能对未来的读者毫无用处。请将您的代码编辑到a中的问题中,否则问题可能会被关闭,谢谢。啊,很抱歉,我现在就解决它。您正在语句
plant=plots[fullplots[i][0]中重新定义plant
script.js
中,因此在第一次执行
updatePlots
方法后,您会得到错误哦,天哪@Satpal你太棒了你真的需要了解JS中的变量范围以及为什么全局变量是邪恶的。如果您确实了解这些主题,您应该真正代表变量范围重构代码。如果您愿意,请在问题本身中发布与问题相关的所有代码-不要将其隐藏在链接后面。你不应该告诉那些想帮忙的潜在帮手,他们必须在异地工作,只是为了了解你在做什么。如果链接中断,这个问题可能对未来的读者毫无用处。请将您的代码编辑到a中的问题中,否则问题可能会被关闭,谢谢。啊,很抱歉,我现在就解决它。您正在语句
plant=plots[fullplots[i][0]中重新定义plant
script.js
中,因此在第一次执行
updatePlots
方法后,您会得到错误哦,天哪@Satpal你太棒了你真的需要了解JS中的变量范围以及为什么全局变量是邪恶的。如果您确实了解这些主题,您应该代表变量范围重构代码。虽然您的分析是正确的,但解决方案并不好。询问者应该做的是使用
var
let
constant
封装其函数的内部变量,这不是decl吗
function updatePlots() {
  // this way, the global plant function is not overwritten
  // @see JavaScript variable scope
  var plant;
  // You might want to 'var' your other local (?) variables, too
  // var fullplots, i, status, growth;
  fullplots = [];
  for (i = 0; i < plots.length; i++) { //get fullplots
    if (plots[i].length) {
      fullplots.push(i);
    }
  }

  for (i = 0; i < fullplots.length; i++) {
    // at this line of code you overwrite the global plant, which is not a function anymore then
    plant = plots[fullplots[i]][0];
    status = plots[fullplots[i]][1];
    growth = plots[fullplots[i]][2];

    if (growth < 100) { //increment
        plots[fullplots[i]][2]++;
    }
  }

  if (document.getElementById('plots').style.display == 'block') {
    getPlots();
  }
}
plant = plots[fullplots[i]][0];