2016-12-04 60 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