嘿,我是javascript的新手,请耐心等待我的错误解释。我尝试使用Google搜索该问题,但据我了解,他们的解决方案不适用于我的情况。我正在尝试压缩我的代码,并且要做到这一点,我需要在函数start()中设置变量x;到1 2或3(取决于我要单击的按钮)
我无法像大多数人那样在函数start()中获取信息,因为我只希望它从3个可能函数之一中获取一个值,而解决方法是在函数start中设置变量()通过在函数starthigh / mid / low()中进行设置。
是否存在全局变量/ return /我不了解或不知道的其他东西可以解决此问题? :)(该代码非常准,因此你们可以更轻松地为我提供帮助,因为我知道所有其他代码都不相关)
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>
答案 0 :(得分:4)
示例中的x
变量在声明它们的函数中是 local 。函数返回后,该变量将不再存在。
要更改此代码而不用其他方式更改代码,则必须将x
设置为 global :
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
的浏览器(本机上还没有)答案 1 :(得分:2)
T.J。 Crowder为您提供了关于如何解决此问题的非常明确的答案,仅此一个答案就足以解决您的问题。该答案还提到最好避免使用全局变量,我认为这是个不错的主意,指出无需使用全局变量即可如何实现同一目标:
function starthigh() {
start(3);
}
function startmid() {
start(2)
}
function startlow() {
start(1)
}
function start(x) {
alert(x)
}
<button onclick="startlow();">1x Bet</button>
<button onclick="startmid();">2x Bet</button>
<button onclick="starthigh();">3x Bet</button>