2016-03-08 85 views
0

我是一名初學者,所以我正在解決一個練習,它是一個函數,返回字符串中第一個重複的字母,我的答案完全不起作用,所以當我看到解決方案時,發現它與我的類似除了答案表已經在for循環內重新分配了一個全局變量,並且重新分配甚至沒有改變變量的值。 你能解釋一下爲什麼你需要重新分配函數才能正常工作。在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

「counter」實際上不是全局變量,因爲它是在一個函數內聲明的 - 這使得它成爲一個局部變量(局部於該函數)。 –

+0

對不起,我的意思是全局到循環而不是整個函數,換句話說計數器沒有被聲明爲循環內的變量 –

+1

想一下'counter'的值。在循環內部有'counter = 0'這個行有什麼不同?在你的想法中(或在一張紙上)運行這兩個函數,逐行並迭代迭代。看看差異以及它們對結果的影響。 – mmgross

回答

1

的重新分配也沒有變化的變量的值。

是的。

請注意,counter變量應該是外部循環的本地,而不是兩個循環的全局(如在您的代碼中)。它可以更好地被寫入

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 s的總作用域的功能,也沒關係,其中var聲明放置。儘管該變量在外循環的每一圈的開始處用(0)(重新)初始化,但它確實很重要。

1

由於內部循環,在開始sub-for(第二個)過程之前,計數器的值被賦值爲0。請注意,休息情況取決於您的櫃檯價值。

如果array.length = 5的元素:{1,2,1,3,4}然後

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 

計數器< 2 => NO所以再次增加X,設置計數器0和循環!

counter x y 
0   1 0 (initial-2) 

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

here counter < 2,so result = array [1] = 2;

這就是您的服務器端代碼的工作原理。如果在開始第二個循環之前沒有將計數器設置爲0,我們將得不到正確的結果,因爲在這種情況下計數器值將爲3,並且循環會繼續。