javascript - 代码在函数中的行为不同
问题描述
我构建了一个运行良好的简单 switch/case 语句。按下回车键,每个案例都被随机抽取并从数组中删除,直到没有剩余。
但是,当我单击按钮调用包含相同 switch/case 语句的函数时,代码的工作方式不同。每次按回车键都不会到达数组的末尾,而是连续绘制一个随机案例,而不会结束。
似乎我的阵列在每次按键时都会重置。为什么代码在函数中的功能不一样?
var casesDrawn = [0, 1, 2];
document.body.addEventListener( 'keyup', function (e) {
if ( e.keyCode == 13 && casesDrawn.length > 0) {
randSelect();
}
function randSelect(){
var randNum = Math.floor(Math.random() * casesDrawn.length);
var num = casesDrawn[randNum];
casesDrawn.splice(randNum, 1);
switch (num){
case 0:
document.getElementById('show').innerHTML = 'case 0 selected';
break;
case 1:
document.getElementById('show').innerHTML = 'case 1 selected';
break;
case 2:
document.getElementById('show').innerHTML = 'case 2 selected';
break;
}
}
});
function myFunction(){
var casesDrawn = [0, 1, 2];
document.body.addEventListener( 'keyup', function (e) {
if ( e.keyCode == 13 && casesDrawn.length > 0) {
randSelect();
}
function randSelect(){
var randNum = Math.floor(Math.random() * casesDrawn.length);
var num = casesDrawn[randNum];
casesDrawn.splice(randNum, 1);
switch (num){
case 0:
document.getElementById('show').innerHTML = 'case 3 selected';
break;
case 1:
document.getElementById('show').innerHTML = 'case 4 selected';
break;
case 2:
document.getElementById('show').innerHTML = 'case 5 selected';
break;
}
}
});
}
<p id="show"></p>
<button onclick="myFunction()">Click to jump to Function</button>
解决方案
每次调用函数时,casesDrawn
都会重新定义变量 /array。这不会在函数外部发生,因为“在函数外部声明的变量会变成 GLOBAL”。W3
但是“在 JavaScript 函数中声明的变量会成为函数的本地变量。” W3
如果您希望变量casesDrawn
在不同的函数调用之间保持其值,您有几个选择:
全局定义变量(函数外)
使用对象(用作类):JavaScript 中的静态变量 或此处:https ://www.quora.com/How-do-you-create-static-variables-in-JavaScript
推荐阅读
- python - 我如何计算用户猜测正确序列的尝试次数
- reactjs - 如果 value 是一个对象,那么 useContext 会导致重新渲染
- asp.net - IIS url 重写为 /applicationname/url
- python - 如何在 plotly (Python) 中解决此图例标签问题?
- mongodb-realm - 如何防止滥用 Mongodb Realm app id?
- javascript - 我想从 PHP 接收 JSON(通过 JS xmlHttpRequest() 的 POST 方法发送)回显
- swift - 只能声明实例方法 @IBAction 构建音频应用程序
- c++ - 2D 数组值更改泄漏到数组中的其他值
- bash - 尝试比较 shell 脚本中的字符,但出现错误
- python - python中的随机模块