Node.js运行含prompt的JS代码报prompt is not defined如何解决
问题原因
alert()和prompt()是浏览器提供的BOM API,仅在浏览器运行环境中存在,不属于JavaScript原生语法的一部分,两类报错都是运行环境不支持对应API导致的:
- 直接双击js文件时,Windows会调用自带的JScript引擎执行代码,该环境没有内置这两个API,因此抛出「对象预期」错误
- Node.js是服务端JavaScript运行环境,同样没有内置浏览器端的BOM API,因此报错
prompt is not defined
修复方案
方案1:浏览器运行(无需修改原代码)
新建HTML文件battleship.html,将原有JS代码嵌入到<script>标签内即可,代码示例如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>战舰游戏</title> </head> <body> <script> var location1 = 3; var location2 = 4; var location3 = 5; var guess; var hits = 0; var guesses = 0; var isSunk = false; while (isSunk == false) { guess = prompt("Ready, aim, fire! (enter a number from 0-6):") if (guess < 0 || guess > 6) { alert("Please enter a valid cell number!"); } else { guesses = guesses + 1; if (guess == location1 || guess == location2 || guess == location3) { alert("HIT!"); hits = hits + 1; if (hits == 3) { isSunk = true; alert("You sank my battleship!"); } } else { alert("MISS"); } } } var stats = "You took " + guesses + " guesses to sink the battleship, " + "which means your shooting accuracy was " + (3 / guesses); alert(stats); </script> </body> </html>
直接用浏览器打开该HTML文件,运行效果和在线运行完全一致。
方案2:适配Node.js命令行运行
使用Node.js内置的readline模块替代浏览器API实现命令行交互,修改后的代码如下,保存为battleship.js后执行node battleship.js即可运行:
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var location1 = 3; var location2 = 4; var location3 = 5; var guess; var hits = 0; var guesses = 0; var isSunk = false; function startGame() { rl.question("Ready, aim, fire! (enter a number from 0-6):", (guessInput) => { guess = Number(guessInput); if (isNaN(guess) || guess < 0 || guess > 6) { console.log("Please enter a valid cell number!"); startGame(); return; } guesses++; if (guess == location1 || guess == location2 || guess == location3) { console.log("HIT!"); hits++; if (hits == 3) { isSunk = true; console.log("You sank my battleship!"); const stats = `You took ${guesses} guesses to sink the battleship, which means your shooting accuracy was ${3 / guesses}`; console.log(stats); rl.close(); return; } } else { console.log("MISS"); } startGame(); }); } startGame();
内容的提问来源于stack exchange,提问作者Nguyen Cuc
相关产品推荐
相关产品推荐

