Javascript 如何访问另一个函数中的变量

Javascript 如何访问另一个函数中的变量,javascript,Javascript,我正在为21点游戏编写代码,遇到了一些问题。我编写了两个函数:一个用于初始交易,另一个用于每个连续点击。这是交易功能: var deck = [1,2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"]; function deal() { var card1_val = Math.floor(Math.random() * deck.length); var card2_val = Math.floor(Math.random() * deck.len

我正在为21点游戏编写代码,遇到了一些问题。我编写了两个函数:一个用于初始交易,另一个用于每个连续点击。这是交易功能:

var deck = [1,2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"];

function deal() {
var card1_val = Math.floor(Math.random() * deck.length);
var card2_val = Math.floor(Math.random() * deck.length);
var card1 = deck[card1_val];
var card2 = deck[card2_val];

var hand = card1 + ", " + card2;

{//card1 Conditionals
if (card1 == "Jack") {
    card1_val = 10;
    }
else if (card1 == "Queen") {
    card1_val = 10;
    }
else if (card1 == "King") {
    card1_val = 10;
    }
else if (card1 == "Ace") {
    card1_val = 11;
    }
}

{//card2 Conditionals
if (card2 == "Jack") {
    card2_val = 10;
    }
else if (card2 == "Queen") {
    card2_val = 10;
    }
else if (card2 == "King") {
    card2_val = 10;
    }
else if (card2 == "Ace") {
    card2_val = 11;
    }
}

var res = card1_val + card2_val;
document.getElementById("result").innerHTML = hand;
//document.getElementById("test").innerHTML = card1_val + ", " + card2_val;

if (res > 21) {
    alert("Blackjack!");
    }
}
function hit() {
var card_val = Math.floor(Math.random() * deck.length);
var nhand = deck[card_val];
bucket = hand + nhand
}
这是hit函数:

var deck = [1,2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"];

function deal() {
var card1_val = Math.floor(Math.random() * deck.length);
var card2_val = Math.floor(Math.random() * deck.length);
var card1 = deck[card1_val];
var card2 = deck[card2_val];

var hand = card1 + ", " + card2;

{//card1 Conditionals
if (card1 == "Jack") {
    card1_val = 10;
    }
else if (card1 == "Queen") {
    card1_val = 10;
    }
else if (card1 == "King") {
    card1_val = 10;
    }
else if (card1 == "Ace") {
    card1_val = 11;
    }
}

{//card2 Conditionals
if (card2 == "Jack") {
    card2_val = 10;
    }
else if (card2 == "Queen") {
    card2_val = 10;
    }
else if (card2 == "King") {
    card2_val = 10;
    }
else if (card2 == "Ace") {
    card2_val = 11;
    }
}

var res = card1_val + card2_val;
document.getElementById("result").innerHTML = hand;
//document.getElementById("test").innerHTML = card1_val + ", " + card2_val;

if (res > 21) {
    alert("Blackjack!");
    }
}
function hit() {
var card_val = Math.floor(Math.random() * deck.length);
var nhand = deck[card_val];
bucket = hand + nhand
}
如果你看hit(),我使用的是来自deal()的var hand。我不能使它全局化,因为我每次都需要一个新的随机值。如何在不重写代码行的情况下访问相同的变量?任何帮助都将不胜感激。

您可以

  • 仅使用
    var-hand将
    hand
    声明在功能范围之外并在
    deal
    功能中使用
    hand
    ,而无需将其重新定义为
    var
  • 或者在
    deal
    功能中声明
    hand
    时使用
    window.hand

    • 全局变量是邪恶的。我会采取更面向对象的方法,像这样

      var Hand = function(bjcallback) {
      
          this.cards = [];
      
          this.onblackjack = bjcallback;
      
          this.deck = [1,2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"];
      
          this.values = {
              "Jack": 10,
              "Queen": 10,
              "King": 10,
              "Ace": 11
          };
      
          this.sum = function() {
              var i, x, res = 0;
              for (i in this.cards) {
                  x = this.cards[i];
                  if (typeof(x) != 'number') { x = this.values[x] };
                  res += x;
              };
              return res
          };
      
          this.pick = function() {
              var pos = Math.floor(Math.random() * this.deck.length);
              var card = this.deck[pos];
              console.log(card);
              return card
          };
      
          this.deal = function(n) {
              n = n || 2;
              for (var i=0; i<n; i++) this.cards.push(this.pick())
          };
      
          this.hit = function() {
              this.cards.push(this.pick());
              if (this.sum() > 21) this.onblackjack();
          }
      }
      
      var hurray = function() { alert('Blackjack!') };
      var hand = new Hand(hurray);
      
      hand.deal();
      hand.hit();
      
      var Hand=函数(bjcallback){
      这个是.cards=[];
      this.onblackjack=bjcallback;
      this.deck=[1,2,3,4,5,6,7,8,9,10,“杰克”、“女王”、“国王”、“王牌”];
      此参数的值={
      “杰克”:10,
      “女王”:10,
      “国王”:10,
      “王牌”:11
      };
      this.sum=函数(){
      变量i,x,res=0;
      (我在这张卡片上){
      x=这张卡片[i];
      如果(typeof(x)!='number'){x=this.values[x]};
      res+=x;
      };
      返回res
      };
      this.pick=函数(){
      var pos=Math.floor(Math.random()*this.deck.length);
      var卡=此.卡组[pos];
      控制台日志(卡片);
      回程卡
      };
      this.deal=函数(n){
      n=n | | 2;
      对于(vari=0;i21)这个.onblackjack();
      }
      }
      var hurray=function(){alert('Blackjack!'};
      var hand=新手(万岁);
      hand.deal();
      hand.hit();
      

      请注意,我不太喜欢卡片,所以我可能会混淆术语或从
      deal
      Return hand开始计算Return
      hand
      。返回手后,如何访问变量?我不能在不刷新随机数的情况下调用该函数。不过,它们都会使其成为全局变量。如果我将hand设置为全局变量,则它将在整个游戏中保持不变(我必须刷新页面才能重新开始)。我不想这样做(特别是因为我计划合并一个系统来保存分数)。还有其他方法吗?@user858962:您可以在开始新游戏时重置变量。@用户为什么不在需要清除变量时清除它呢。全局变量不是一成不变的。@user858962一个玩家可以同时拥有多只手吗?如果没有,您可以安全地将其设置为全局变量,并在必要时清除/修改/更新它(新回合、玩家要求新卡、游戏结束等)。全局变量不是常量,它只是全局范围内的一个变量(在任何地方都可以访问)@mykhal--我对OOP知道的不多。。。你介意把这种方法分解一下吗?这里发生了什么?@codennija,它可以用更简单的方式编写,如果您只需要一个
      指针
      ,您可以代替
      函数指针(){this.x=…;this.y=…};hand=new hand()
      使用
      hand={x:…,y:…}
      并将
      替换为
      hand
      。为了更深入地理解js,我建议使用以下线程:@mykhal——您的方法非常有用。我对第一个答案进行了检查,因为我对OOP的知识充其量只是初步的。我不得不采用程序性的方法。谢谢你。