Javascript全局变量不工作
我对JavaScript中的全局变量有问题。我尝试做的是在函数外部声明变量,然后在一个函数中更改它,然后调用另一个函数。从我所读到的,这应该是有效的,但它只是给我未定义的。这是我正在制作的s纸牌游戏的代码Javascript全局变量不工作,javascript,global-variables,Javascript,Global Variables,我对JavaScript中的全局变量有问题。我尝试做的是在函数外部声明变量,然后在一个函数中更改它,然后调用另一个函数。从我所读到的,这应该是有效的,但它只是给我未定义的。这是我正在制作的s纸牌游戏的代码 var randSuit; function getRandCard() { var randNum; var randSuit; var randVal; randNum = Math.floor(Math.random()*13)+1; if (ra
var randSuit;
function getRandCard() {
var randNum;
var randSuit;
var randVal;
randNum = Math.floor(Math.random()*13)+1;
if (randNum == 1) {
randVal = "2";
} else if (randNum == 2) {
randVal = "3";
} else if (randNum == 3) {
randVal = "4";
} else if (randNum == 4) {
randVal = "5";
} else if (randNum == 5) {
randVal = "6";
} else if (randNum == 6) {
randVal = "7";
} else if (randNum == 7) {
randVal = "8";
} else if (randNum == 8) {
randVal = "9";
} else if (randNum == 9) {
randVal = "10";
} else if (randNum == 10) {
randVal = "Jack";
} else if (randNum == 11) {
randVal = "Queen";
} else if (randNum == 12) {
randVal = "King";
} else if (randNum == 13) {
randVal = "Ace";
}
randNum = randNum = Math.floor(Math.random()*4)+1;
if (randNum == 1) {
randSuit = "Hearts";
} else if (randNum == 2) {
randSuit = "Clubs";
} else if (randNum == 3) {
randSuit = "Spades";
} else if (randNum == 4) {
randSuit = "Diamonds";
}
console.log(randSuit);
var randCard = (randVal + " of " + randSuit);
//Return the Value of the randomly chosen Card.
return (randCard);
}
//This function calls the random card from the function above, then applies logic to see if it's the same, then outputs the result.
$(function() {
$('#drawCard').click(function() {
var e = document.getElementById("faceValue");
var faceValue = e.options[e.selectedIndex].text;
var e = document.getElementById("suit");
var suit = e.options[e.selectedIndex].text;
$('#oneCardContainer').slideDown('slow');
var pickedCard = (faceValue + " of " + suit);
var randCard = getRandCard();
console.log (randSuit);
if (pickedCard == randCard) {
$("#oneCardResults").val("You Chose a " + pickedCard + " and got a " + randCard + ". \nYou Win!");
} else if (pickedCard != randCard) {
$("#oneCardResults").val("You Chose a " + pickedCard + " and got a " + randCard + ". \nYou Lose!");
}
});
});
这就是我尝试过的代码,我尝试传递的变量是randSuit。我做错了什么?您正在定义一个名为
randSuit
的全局变量,但也是一个同名的局部变量。当你做randSuit=randSuit代码>,实际上什么也不会发生,因为左侧和右侧都在引用局部变量。您需要以不同的方式命名它们。您在函数中重新声明了randSuit
;该声明隐藏了全局randSuit
,因此您的函数正在修改它自己的局部变量,而不是全局变量。试试这个,它是代码的一个简化版本,应该可以工作:
var randSuit;
function getRandCard() {
var randNum, randVal;
var upperCards = ["Jack", "Queen", "King", "Ace"];
var suits = ["Hearts", "Clubs", "Spades", "Diamonds"];
randNum = Math.floor(Math.random()*13)+1;
(randNum < 10) ? randVal++ : randVal = upperCards[randNum-10];
randSuit = suits[Math.floor(Math.random()*4)];
// return the value of the randomly chosen card.
return (randVal + " of " + randSuit);
}
var-randSuit;
函数getRandCard(){
var randNum,randVal;
var upperCards=[“杰克”、“女王”、“国王”、“王牌”];
var套装=[“红心”、“梅花”、“黑桃”、“钻石”];
randNum=Math.floor(Math.random()*13)+1;
(randNum<10)?randVal++:randVal=upperCards[randNum-10];
randSuit=suits[Math.floor(Math.random()*4)];
//返回随机选择的卡的值。
返回值(randVal+“+randSuit”中的“+randSuit”);
}
我使用了几个数组和一个三元运算符来大大缩短代码。我还消除了不必要的局部randSuit
变量,该变量的作用域为全局对象并覆盖了全局对象。在函数内部重新声明randSuit时,它被私有化为该函数
var randSuit = 5; // not shared
function getRandCard() {
var randSuit = 3; // not shared
console.log(randSuit);
}
getRandCard();
console.log(randSuit);
如果要共享randSuit
的输出,请不要重新声明变量
var randSuit = 5; // shared
function getRandCard() {
randSuit = 3; // shared
console.log(randSuit);
}
getRandCard();
console.log(randSuit);
更好的选择是模块化CARD变量和方法
var cardStack = (function () {
var randSuit; // protected from global
return {
getRandSuit: function () { return randSuit; }, // but still readable
getRandCard: function () { .... }
};
}());
var card = cardStack.getRandCard();
suit = cardStack.getRandSuit();
@Elliot Bonneville和@jfriend00的答案是好的,但这里有一些关于局部变量和全局变量问题背后的理论解释
JavaScript处理全局变量和局部变量的方式是,当解释器遇到标识符时,它会在当前范围内搜索它(在您的例子中:getRandCard
),如果找不到它,解释器会在上面一个范围,如果找不到它,它会在上面两个范围,以此类推
randSuit = randSuit;
在这一行中,这些标识符都将引用相同的局部变量,因为解释器在局部范围中找到它们,所以实际上这一行什么也不做
要引用全局变量,应创建对其作用域的引用:
var randSuit;
var that = this;
function getRandCard() {
...
}
然后,替换:
randSuit = randSuit;
与:
如果要使用全局变量,请全局定义该变量,不要在本地重新定义它,只在本地使用它。当您在本地重新定义它时,您将创建一个新的本地变量,其名称与在该范围内替换全局变量的名称相同
其余部分实际上是一个注释,但由于不能在注释中有效地包含代码,我将把它作为答案的一部分发布。您确实需要对代码应用干燥(不要重复)原则。这是可怕的重复:
randNum = Math.floor(Math.random()*13)+1;
if (randNum == 1) {
randVal = "2";
} else if (randNum == 2) {
randVal = "3";
} else if (randNum == 3) {
randVal = "4";
} else if (randNum == 4) {
randVal = "5";
} else if (randNum == 5) {
randVal = "6";
} else if (randNum == 6) {
randVal = "7";
} else if (randNum == 7) {
randVal = "8";
} else if (randNum == 8) {
randVal = "9";
} else if (randNum == 9) {
randVal = "10";
} else if (randNum == 10) {
randVal = "Jack";
} else if (randNum == 11) {
randVal = "Queen";
} else if (randNum == 12) {
randVal = "King";
} else if (randNum == 13) {
randVal = "Ace";
}
randNum = randNum = Math.floor(Math.random()*4)+1;
if (randNum == 1) {
randSuit = "Hearts";
} else if (randNum == 2) {
randSuit = "Clubs";
} else if (randNum == 3) {
randSuit = "Spades";
} else if (randNum == 4) {
randSuit = "Diamonds";
}
并且可以用这种重复性小得多的代码替换:
var cards = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "Jack", "Queen", "King", "Ace"];
randVal = cards[Math.floor(Math.random() * cards.length)];
var suits = ["Hearts", "Clubs", "Spades", "Diamonds"];
randSuit = suits[Math.floor(Math.random() * suits.length)];
如果你真的想耍花招,你甚至可以这样做:[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“杰克”、“女王”、“国王”、“王牌”][Math.floor(Math.random()*13)]代码>因为您只使用一次卡
变量。=)不再相关,但您无法通过那获得randSuit
,除非那
是窗口
@jli true,除非您这样声明变量:this.randSuit=val代码>
var cards = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "Jack", "Queen", "King", "Ace"];
randVal = cards[Math.floor(Math.random() * cards.length)];
var suits = ["Hearts", "Clubs", "Spades", "Diamonds"];
randSuit = suits[Math.floor(Math.random() * suits.length)];