javascript - 在不同的函数中为函数设置变量
问题描述
嘿,我是 javascript 的一个相当大的菜鸟,请耐心等待我的错误解释。我尝试用谷歌搜索这个问题,但据我了解,他们的解决方案不适用于我的情况。我正在尝试压缩我的代码,为此我需要在函数 start(); 中设置变量 x 到 1 2 或 3 (取决于我会点击什么按钮)
我无法像大多数人那样在函数 start() 中获取信息,因为我只希望它从 3 个可能函数中的一个中获取一个值,解决方法是在函数 start() 中设置变量从函数 starthigh/mid/low() 设置它。
是否有一个全局变量/返回/其他我不理解或不知道的东西可以解决这个问题?:) (代码非常准系统,所以你们更容易帮助我,因为我知道所有其他代码都无关紧要)
function starthigh() {
var x = 3;
}
function startmid() {
var x = 2;
}
function startlow() {
var x = 1;
}
function start() {
alert(x) /* Undefined (make this DEFINED with code only in startlow/mid/high functions) */
}
<button onclick="startlow(); start();">1x Bet</button>
<button onclick="startmid(); start();">2x Bet</button>
<button onclick="starthigh(); start();">3x Bet</button>
解决方案
您的示例中的x
变量对于声明它们的函数是本地的。一旦函数返回,变量就不再存在。
要在不以其他方式更改代码的情况下更改它,您必须x
改为全局:
var x; // Global
function starthigh() {
x = 3;
}
function startmid() {
x = 2;
}
function startlow() {
x = 1;
}
function start() {
alert(x) /* Undefined (make this DEFINED with code only in startlow/mid/high functions) */
}
然而,最好避免使用全局变量,也许是通过使用现代事件处理:
<button id="btn1x">1x Bet</button>
<button id="btn2x">2x Bet</button>
<button id="btn3x">3x Bet</button>
<script>
(function() { // Scoping function, so its contents aren't globals
var x;
function starthigh() {
x = 3;
}
function startmid() {
x = 2;
}
function startlow() {
x = 1;
}
function start() {
alert(x) /* Undefined (make this DEFINED with code only in startlow/mid/high functions) */
}
// Hook up your handlers
document.getElementById("btn1x").addEventListener("click", function() {
starthigh();
start();
});
document.getElementById("btn2x").addEventListener("click", function() {
startmid();
start();
});
document.getelementById("btn3x").addEventListener("click", function() {
startlow();
start();
});
})();
</script>
不过,我们可以更进一步。starthigh
, startmid
, 并且startlow
都做同样的事情,只是使用不同的值。所以我们可以有一个函数来做这件事,也许有一个函数调用它然后调用start
:
<button id="btn1x">1x Bet</button>
<button id="btn2x">2x Bet</button>
<button id="btn3x">3x Bet</button>
<script>
(function() { // Scoping function, so its contents aren't globals
var x;
function startWith(value) {
x = value;
start();
}
function start() {
alert(x) /* Undefined (make this DEFINED with code only in startlow/mid/high functions) */
}
// Hook up your handlers
document.getElementById("btn1x").addEventListener("click", startWith.bind(null 3));
document.getElementById("btn2x").addEventListener("click", startWith.bind(null 2));
document.getelementById("btn3x").addEventListener("click", startWith.bind(null 2));
})();
</script>
或者我们可以存储要在按钮上使用的值:
<button class="start" data-value="3">1x Bet</button>
<button class="start" data-value="2">2x Bet</button>
<button class="start" data-value="1">3x Bet</button>
<script>
(function() { // Scoping function, so its contents aren't globals
var x;
function startWithClick() {
startWith(+this.getAttribute("data-value"));
}
function startWith(value) {
x = value;
start();
}
function start() {
alert(x) /* Undefined (make this DEFINED with code only in startlow/mid/high functions) */
}
// Hook up your handlers
document.querySelectorAll(".start").forEach(function(btn) {
btn.addEventListener("click", startWithClick);
});
})();
</script>
更多探索:
addEventListener
Function#bind
querySelectorAll
- 我对如何为还没有原生浏览器的浏览器添加
forEach
的答案NodeList
推荐阅读
- html - 无法在 UL + LI (CSS) 中隐藏 HTML
- node.js - 确认付款已到达外部银行账户
- sql-server - 加入并更改显示值
- google-cloud-firestore - 在 Google FireStore 中保护和选择分层数据
- python - 如何更正错误 1 位置参数丢失,其中类实例是另一个类的实例的属性?
- python - 如何在 Allure 报告 python 中创建多个测试用例
- apache-flink - Flink 广播状态 - RocksDB 状态后端
- kubernetes - 绕过 nginx 入口控制器速率限制
- mysql - 会议室预订系统 - RFID读卡器
- java - 如何在java中获取字符串的子部分?