为其他函数中的函数设置变量

时间:2018-11-07 13:14:33

标签: javascript html

嘿,我是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>

2 个答案:

答案 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>

不过,我们可以更进一步。 starthighstartmidstartlow都做相同的事情,只是值不同。因此,我们可以有一个函数来执行此操作,也许有一个函数先调用它然后再调用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>

更多探索:

答案 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>