2016-12-04 58 views
0

首先在這裏發佈什麼可能是一個非常基本的JavaScript問題。我有以下代碼:JScript - 函數之間的訪問變量

var decklist = []; 

function CreateDeck() { 
    var deckform = document.getElementById("txtar_decklist").value.split('\n'); 
    var stats = []; 
    for (var n = 0; n < deckform.length; n++){ 
     if (deckform[n] != ""){ 
      stats = deckform[n].split(','); 
      for (var x = 0; x < parseInt(stats[0],10); x++){ 
       decklist.push({Name:  stats[1], 
           Color: stats[2], 
           Type:  stats[3], 
           Subtype: stats[4], 
           Level: stats[5], 
           Attack: stats[6], 
           Defense: stats[7], 
           Drawn: false}); 
      } 
     } 
    } 
}; 

function DrawCard() { 
    var randomcard = 0; 
    var carddrawn = false; 
    while (carddrawn == false){ 
     randomcard = (Math.floor(Math.random() * decklist.length + 1)) - 1; 
     if (decklist[randomcard].Drawn == false){ 
      alert(JSON.stringify(decklist[randomcard])); 
      decklist[randomcard].Drawn = true; 
      carddrawn = true; 
     } 
    } 
}; 

在我的網頁,用戶將一個套牌並創建對象的數組來存儲每個卡片的統計/字段。我有第二個按鈕試圖「繪製」一張屬性爲.Drawn = false的卡片,然後立即爲該屬性分配一個真實值以防止用戶再次繪製同一張卡片。

我似乎無法弄清楚如何讓這兩個函數之間的變量「共享」。我已經嘗試了我認爲是如上所示的全局變量聲明,以及嘗試創建僞全局使用模塊。有人會介意讓我看看我做錯了什麼嗎?

哦,如果我的變量聲明其實對我正在做的事情很好,問題在於第二個函數,請告訴我。

我的背景是VB.Net(也是VBScript + VBA)和SQL。在大學裏學過非常基本的JavaScript和HTML課程,但是一旦課程結束後我就沒有足夠的時間來追求它們,以保留我學到的東西。

真的很感謝任何幫助!

+1

爲什麼不使用函數組合,並傳遞參數,比如'drawCard(createDeck(deckForm))'? – elclanrs

+0

目前它是一個全局變量,所以它是跨功能共享的。你能告訴我們什麼是問題嗎? – Rajesh

+0

這是否有可能與從表單中的按鈕調用第一個函數有關? – TylerG

回答

0

聽起來像一個範圍問題。如果您使用require,並且每個函數駐留在它自己的文件中,或者正在使用require通過某個其他函數訪問decklist變量,那麼desklist var將超出範圍。

一種解決方案是設置套牌的窗口範圍爲:

window.decklist = []; 

這將確保套牌是從頁面上的任何訪問。請注意,您可能必須將您對函數中的decklist的任何引用更改爲使用window.decklist。

+0

它已經是窗口的一部分,因爲它在任何功能之外 – Rajesh

+0

他提到使用模塊,所以我假設在這裏。 – bob

+0

即使它被封裝在模塊中,它仍然可以在兩個函數 – Rajesh