Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么单击不同按钮时会显示相同的数组值?_Javascript_Arrays_Function_Scope - Fatal编程技术网

Javascript 为什么单击不同按钮时会显示相同的数组值?

Javascript 为什么单击不同按钮时会显示相同的数组值?,javascript,arrays,function,scope,Javascript,Arrays,Function,Scope,考虑以下代码: <button id="btn-0">Button 1!</button> <button id="btn-1">Button 2!</button> <button id="btn-2">Button 3!</button> <button id="btn-3">Button 4!</button> <script type="text/javascript">

考虑以下代码:

<button id="btn-0">Button 1!</button>
<button id="btn-1">Button 2!</button>
<button id="btn-2">Button 3!</button>
<button id="btn-3">Button 4!</button>
<script type="text/javascript">
    var prizes = ['Watch','A Unicorn!', 'A Hug!', 'Fresh Laundry!'];
    for (var btnNum = 0; btnNum < prizes.length-1; btnNum++) {
        // for each of our buttons, when the user clicks it...
        document.getElementById('btn-' + btnNum).onclick = function() {
            // tell her what she's won!
            alert(prizes[btnNum]);
        };
    }
</script>
按钮1!
按钮2!
按钮3!
按钮4!
var奖品=[‘手表’、‘独角兽’、‘拥抱’、‘新鲜衣物’];
对于(var btnNum=0;btnNum<0.length-1;btnNum++){
//对于我们的每个按钮,当用户单击它时。。。
document.getElementById('btn-'+btnNum).onclick=function(){
//告诉她她赢了什么!
警报(奖品[btnNum]);
};
}

我希望它能像点击不同的按钮一样工作,不同的数组值会出现。但它只会提醒“新鲜衣物”,无论点击哪个按钮。我不明白这里有什么问题?为什么通过for循环分配的每个函数表达式都引用奖品数组的最后一个元素?

当您单击
btnNum的值时,所有单击事件处理程序的最后一个值都将是
。因此,您的事件需要获得正确的值

您可以将事件侦听器放入立即调用的函数表达式中,该表达式传递
btnNum
的值

var奖品=['Watch'、'anunicorn!'、'anhough!'、'freshwattery!'];
对于(var btnNum=0;btnNum<0.length-1;btnNum++){
(功能(el){
document.getElementById('btn-'+el).onclick=function(){
警报(奖品[el]);
};
})(b nnum);
}
按钮1!
按钮2!
按钮3!

按钮4单击时,
btnNum
的值将是所有单击事件处理程序的最后一个值。因此,您的事件需要获得正确的值

您可以将事件侦听器放入立即调用的函数表达式中,该表达式传递
btnNum
的值

var奖品=['Watch'、'anunicorn!'、'anhough!'、'freshwattery!'];
对于(var btnNum=0;btnNum<0.length-1;btnNum++){
(功能(el){
document.getElementById('btn-'+el).onclick=function(){
警报(奖品[el]);
};
})(b nnum);
}
按钮1!
按钮2!
按钮3!

按钮4
这是因为所有闭包都引用相同的
btnNum
变量。这是因为所有闭包都引用相同的
btnNum
变量。您知道这是JavaScript标记中最常见的重复问题之一。为什么要回答它而不是指向前面的答案?@T.J.Crowder有道理。注意。您知道这是JavaScript标记中最常见的重复问题之一。为什么要回答它而不是指向前面的答案?@T.J.Crowder有道理。注意。