2015-06-01 175 views
0

我想使用下面的switch語句來改變一個全局變量,但它只會改變一次。爲什麼我的變量不變?

HTML

<button type="button" value =15>16x16</button> 
<button type="button" value =31>32x32</button> 
<button type="button" value =63>64x64</button> 

的JavaScript

var initial_size = 15; 
var $cl; 
var $size; 

$(document).ready(function(){ 
    populate(initial_size); 
}); 

function populate(size){ 
    $('.main-table').empty(); 
    $size = size; 
    switch($size){ 
    case 15: 
     $cl = 'box'; 
     break; 
    case 31: 
     $cl = 'bigger-box'; 
     console.log("case 31"); 
     break; 
    case 63: 
     $cl = 'biggest-box'; 
     console.log("case 63"); 
     break; 
    default: 
     break; 
    } 

    console.log($cl); 

    for(var i=0; i < $size; i++){ 
     $tr = $("<tr></tr>"); 
     for(var j=0; j < $size; j++){ 
      $div = $("<div class=" +$cl+"></div>"); 
      $div.css('background-color', 'lightslategrey'); 
      $tr.append($("<td></td>").append($div)); 
     } 
     $(".main-table").append($tr); 
    } 
    run(); 
}; 

function run(){ 
    $('.box').hover(function(){ 
     $(this).css('background-color', 'black'); 
    }); 

    $('button').click(function(){ 
     console.log($(this).val()); 
     populate($(this).val()); 
    }); 
    }; 

所以,當我跑我的代碼,$ CL將被設置爲 '盒子',但每當我點擊另一個按鈕,循環再次運行,$ cl不會更改爲其他任何類。我是否使用switch語句錯誤,或者我沒有正確解析該值,或者是因爲使用全局變量而導致的問題?我使用全局變量的唯一原因是因爲我不太熟悉JavaScript中的範圍工作方式,所以我認爲這種方式可能更容易。

+6

您發佈的代碼不完整,但是從您發佈的內容來看,您實際上並沒有運行'run()'函數來設置事件處理程序。另外,你還沒有用閉合括號關閉你的'run()函數''' –

+1

嘗試在jsfiddle.net上創建一個小提琴並鏈接到你的問題中的小提琴。 –

+1

也沒有關閉你填充函數。這裏的最後一個關閉大括號與switch語句 –

回答

0

我是否使用switch語句錯誤,或者我沒有正確解析該值?

正是這樣。您的按鈕的值是字符串,但您的switch聲明正在使用數字。 case語句使用包含類型的嚴格相等性。因此,要麼將您的值解析爲數字,要麼在您的案例中使用字符串文字。目前,您的代碼將始終達到default的情況。

我使用全局變量的唯一原因是因爲我不太熟悉JavaScript中的範圍如何工作,所以我想這種方式可能會更容易。

其實非常簡單:所有函數聲明,參數聲明和var聲明的作用域都是包含它們的函數。你真的應該在這裏使用局部變量。

順便說一句,你真的應該將run();populate調用到文檔就緒回調中,populate(initial_size);旁邊。目前,您每次單擊按鈕時都會附加一組新的事件偵聽器,並且所有這些偵聽器都會在每次單擊時觸發。