未捕获的类型错误:modal.openModal不是函数



我正试图用JavaScript从IIFE游戏控制器模块中触发模式弹出。模式弹出窗口位于其自己的模块中,并返回所需的功能。

我最近才了解到模块,所以我肯定错过了一些明显的东西,但在盯着我的代码看了几个小时并试图在网上搜索之后,我正在努力寻找解决方案。

下面是游戏控制器模块:

// Game Controller
const gameController = (() => {
// Create players
let player1 = PlayerFactory("Player 1", "images/player.png");
let player2 = PlayerFactory("Player 2", "images/computer.png");
// Initialise game variables
let round = 0;
let maxRounds = 8;
let turn = 0;
let player1Score = 0;
let player2Score = 0;

// Main game function
const play = function (e) {
if (round == maxRounds) {
// Increment both players' scores
player1Score++;
player2Score++;
// Display modal pop-up for tie
}
switch (turn) {
case 0:
if (player1.play(e)) {
e.target.dataset.player = 0;
round++;
turn = 1;
if (checkWinner() == 0) {
// Increment player 1 score
player1Score++;
// Display modal popup for player 1 win
modal.openModal();
}
}
break;
case 1:
if (player2.play(e)) {
e.target.dataset.player = 1;
round++;
turn = 0;
if (checkWinner() == 0) {
// Increment player 2 score
player2Score++;
// Display modal popup for player 2 win
}
}
break;
}
}
// Check winner function
const checkWinner = function () {
// Initialise winner variable
let gameWinner = '';
// For loop checking for horizontal wins
for (i=0; i<9; i=i+3) {
if (gameBoard.boardArray[i].dataset.player) {
if ((gameBoard.boardArray[i].dataset.player == gameBoard.boardArray[i+1].dataset.player) && (gameBoard.boardArray[i+1].dataset.player == gameBoard.boardArray[i+2].dataset.player)) {
gameWinner = gameBoard.boardArray[i].dataset.player;
return gameWinner;
}
}
}
// For loop checking for vertical wins
for (i=0; i<3; i++) {
if (gameBoard.boardArray[i].dataset.player) {
if ((gameBoard.boardArray[i].dataset.player == gameBoard.boardArray[i+3].dataset.player) && (gameBoard.boardArray[i+3].dataset.player == gameBoard.boardArray[i+6].dataset.player)) {
gameWinner = gameBoard.boardArray[i].dataset.player;
return gameWinner;
}
}
}
// For loop checking for diagonal wins
if (gameBoard.boardArray[0].dataset.player) {
if ((gameBoard.boardArray[0].dataset.player == gameBoard.boardArray[4].dataset.player) && (gameBoard.boardArray[4].dataset.player == gameBoard.boardArray[8].dataset.player)) {
gameWinner = gameBoard.boardArray[0].dataset.player;
return gameWinner;
}
}
// For loop checking for diagonal wins
if (gameBoard.boardArray[2].dataset.player) {
if ((gameBoard.boardArray[2].dataset.player == gameBoard.boardArray[4].dataset.player) && (gameBoard.boardArray[4].dataset.player == gameBoard.boardArray[6].dataset.player)) {
gameWinner = gameBoard.boardArray[2].dataset.player;
return gameWinner;
}
}
}
// Click event listener to call play function
window.addEventListener('DOMContentLoaded', (event) => {
let cells = document.querySelectorAll(".game-cell").forEach(cell => {
cell.addEventListener("click", play);
})
});

return {
};
})();

这是模式弹出模块:

// Modal Popup
const modal = (() => {
const modalPopup = document.querySelector(".modal");
const openModal = function () {
modalPopup.style.display = "block";
}
return {
openModal
}
})

目前,当我用以下行(在游戏控制器中(触发模式弹出时:

// Display modal popup for player 1 win
modal.openModal();

我在控制台中收到这个错误:

Uncaught TypeError: modal.openModal is not a function

如果有人能在这里提供帮助,我们将不胜感激。

谢谢!

这是因为modal是一个函数,用括号来调用它,就像这个

modal().openModal()

检查是否定义很简单

if (modal.openModal)
alert("is modal");
else
alert("isnt modal");

这将提醒";不是模态的";因为modal是函数

if (modal().openModal)
alert("is modal");
else
alert("isnt modal");

这将提醒";是模态的";,这是正确的。

最新更新