【问题标题】:Using .shift() on function argument which affects the global array that is passed as the argument在函数参数上使用 .shift() 会影响作为参数传递的全局数组
【发布时间】:2016-03-30 11:20:40
【问题描述】:

我目前正在为 freeCodeCamp.com 开发一个 javascript 项目,但我遇到了一个数组问题。

该项目是重新创建游戏“西蒙”。我这样做是通过生成一个随机数并将其推入一个数组(正确模式),然后将该数组传递给一个将相应地播放音频/视频动画的函数。

问题是,我在函数参数('sound')上使用 .shift 并递归调用函数以循环遍历数组,直到它为空。当我这样做时,它以某种方式对全局数组执行此操作。因此,一旦将数组传递给函数,函数参数(数组)就会使用 shift 进行修剪,这也适用于全局数组。

我的印象是函数参数等于传递的项目,但更改参数不会影响实际传递的项目。这是不正确的吗?如果是这样,我怎样才能正确执行此功能?

我使用这种方法的唯一原因是因为我需要使用 setTimeout 来延迟游戏中播放的音频文件之间的延迟,否则它们会同时播放。

这里是代码重要部分的副本。

//ANIMATE DIV BUTTON & PLAY RELATIVE AUDIO FILE
        function animateMoveList(sound){
          var soundFile = parseInt(sound[0]);
            if(sound.length > 0){
              $(".circle").removeClass('highlighted');
                switch(soundFile){
                    case 1:
                      $(".circle1").addClass('highlighted');
                      audio1.play();
                      break;
                    case 2:
                      $(".circle2").addClass('highlighted');
                      audio2.play();
                      break;
                    case 3:
                      $(".circle3").addClass('highlighted');
                      audio3.play();
                      break;
                    case 4:
                      $(".circle4").addClass('highlighted');
                      audio4.play();
                      break
                 }
                setTimeout(function(){
                  if(typeof sound !== 'string'){
                    sound.shift();
                  } else {
                    sound = [];
                  }
                  $(".circle").removeClass('highlighted');
                  animateMoveList(sound);
                }, 1000);

            }

        }
        function comparePatterns(){

        }
        //GENERATE RANDOM NUMBER, PUSH TO correctPattern AND PLAY ANIMATION
        function pcMove(){
          var randomNumber = Math.floor(Math.random() * 4 + 1);
          correctPattern.push(randomNumber);
          setTimeout(function(){
              console.log(correctPattern);
              animateMoveList(correctPattern);
              userTurn = true;
          }, 500);

        }

【问题讨论】:

  • 尝试使用.slice()创建sound数组的副本
  • 使用 .slice() 有效,谢谢。解决问题没什么大不了的,我相信有很多方法可以解决这个问题。真的,我想了解为什么会这样。再次感谢!
  • @NickolasGettel 我试图在我的回答中解释这一点。还要了解更多关于 JS 中“混合”传递的信息,请查看stackoverflow.com/questions/518000/…

标签: javascript jquery arrays arguments


【解决方案1】:

Javascript 数组是通过引用传递的,如果你对函数内部的数组进行任何更改,这些更改都会保存在原始数组中。

按值传递数组(传递数组的副本),这意味着对传递的数组所做的更改不会保存在原始数组中。这可以通过使用本机数组方法“slice()”来完成,如任何javascript language reference 中所述。在这种情况下,“切片”方法将返回数组的浅表副本。

参考资料:

  1. Mastering Javascript Arrays
  2. Javascript Arrays – passing by reference or by value?

【讨论】:

  • 感谢您的解释和参考!
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 2021-02-23
  • 1970-01-01
  • 2020-07-28
  • 2020-01-26
  • 2016-10-24
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多