在JavaScript中为for循环重新分配变量的目的是什么?

时间:2016-03-08 18:21:43

标签: javascript

我是初学者,所以我正在解决一个练习,它是一个函数,用于返回字符串中第一个未重复的字母,我的答案根本不起作用,所以当我查看解决方案时,我发现它类似于我的答案表在for循环中重新分配了一个全局变量,并且重新分配甚至没有改变变量的值。 你能解释为什么你需要重新分配功能才能正常工作。

这是我的代码:

function find(str) {  

  var array = str.split('');  
  var result = '';  
  var counter = 0; // counter declared here 

  for (var x = 0; x < array.length; x++) {  
    //counter missing here

    for (var y = 0; y < array.length; y++) {  

      if (array[x] === array[y]) { counter = counter + 1;} 
    }  



    if (counter < 2) {  
      result = array[x];  
      break;  
    }  
  }  



  return result;  
}

这是答案表中正常运行的代码:

function find(str) {  

  var array = str.split('');  
  var result = '';  
  var counter = 0;  //counter declared here

  for (var x = 0; x < array.length; x++) {  
    counter = 0; //counter is reassigned here 

    for (var y = 0; y < array.length; y++) {  

      if (array[x] === array[y]) { counter = counter + 1;} 
    }  



    if (counter < 2) {  
      result = array[x];  
      break;  
    }  
  }  



  return result;  
}

2 个答案:

答案 0 :(得分:1)

  

重新分配甚至没有改变变量的值。

是的。

请注意,function find(str) { var array = str.split(''); var result = ''; //var counter; (hoisted) for (var x = 0; x < array.length; x++) { var counter = 0; // ^^^ for (var y = 0; y < array.length; y++) { if (array[x] === array[y]) counter = counter + 1; } if (counter < 2) { result = array[x]; break; } } return result; } 变量应该是外部循环的本地变量,而不是两个循环的全局变量(就像在代码中一样)。最好写一下

var

但由于var始终作用于函数,因此放置0声明的位置并不重要。尽管在外循环的每一圈开始时变量都是用{{1}}进行(重新)初始化,但这很重要。

答案 1 :(得分:1)

由于内部循环,在开始sub-for(第二个)的过程之前,counter的值被赋值为0。请注意,中断情况取决于您的计数器值。

如果array.length = 5,则元素为:{1,2,1,3,4},然后

save('TtDataBase.mat','description','description2','-append')

计数器&lt; 2 =&gt;否则增加X,设置计数器0并再次循环!

counter   x    y
0         0    0  (initial) 

0         0    0  (if array[0] == array[0]) counter++
1         0    1  (if array[0] == array[1]) nothinghappens
1         0    2  (if array[0] == array[2]) counter++
2         0    3  (if array[0] == array[3]) nothinghappens
2         0    4  (if array[0] == array[4]) nothinghappens

这里的柜台&lt; 2,所以result = array [1] = 2;

这就是您的服务器端代码的工作方式。如果在开始第二个for循环之前没有将counter设置为0,我们将无法得到正确的结果,因为在这种情况下计数器值将为3并且循环将继续...