3 回答

TA貢獻1845條經驗 獲得超8個贊
您必須在函數外部聲明變量并將它們設置在函數內部。否則它們的值在每次函數調用中都會被重置。
嘗試這個:
var oldEmoji = '';
var emoji = '';
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
function randEmoji() {
oldEmoji = emoji;
emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
if (oldEmoji == emoji) {
randEmoji();
} else {
console.log(emoji);
}
}
var i = 0;
while (i < 20) {
randEmoji();
i += 1;
}

TA貢獻1843條經驗 獲得超7個贊
問題在于函數作用域的任何局部變量(意味著在函數內部聲明)在函數完成執行后都會被丟棄。因此,每次運行該函數emoji并oldEmoji從undefined
一種解決方案是將其中一個聲明移動到父范圍,如下所示:
var oldEmoji;
function randEmoji() {
var emojiList = [";)", ":D"];
var emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
if (oldEmoji == emoji) {
randEmoji();
} else {
console.log(emoji);
oldEmoji = emoji;
}
}
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
看這里,我們實際上從來沒有重復過。

TA貢獻2041條經驗 獲得超4個贊
var oldEmoji = '';
var emoji = '';
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
function randEmoji(){
// remove old emoji first to avoid doing a recursive call
var check = oldEmoji? emojiList.filter(e => e !== oldEmoji ) : emojiList;
var emoji = check[Math.floor(Math.random() * check.length)];
oldEmoji = emoji
document.getElementById("emojiText").innerHTML = "Look how fun! ---> " + emoji + " <--- An emoji!";
console.log(emoji);
}
添加回答
舉報