javascript - 在不同的函数中为一个函数设置变量

标签 javascript html

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

不过,我们可以更进一步。 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>

更多探索:

关于javascript - 在不同的函数中为一个函数设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53190211/

相关文章:

jquery - 父 div 类的 z-index 高于子类

javascript - 从字符串的开头和结尾删除字符的所有实例

javascript - jQuery 对话框 : Open position at mouse position. 在 Firefox 中不起作用

javascript - 每次读取数据 block 后等待 - Node JS

javascript - 如何在 React 中使用 setState 更新数组元素?

javascript - 空置检查和更改可见性

javascript - 当 JavaScript 代码中包含 HTML 标签时,如何让 JSHint 发出警告?

c# - .NET 中的 try-catch 执行 jQuery 脚本

javascript - 新的 CSSStyleDeclaration

javascript - 只需添加一个类即可实现 SVG 动画