功能没有改变变量,是不是全局?

时间:2016-05-03 22:04:57

标签: javascript jquery html

所以我有一个非常简单的测验,由7个选择框和一个提交按钮组成。我想要实现的是,如果没有更改任何选择框,则会弹出警告错误,并且如果它们已被更改以便提高分数。

我已经设置了一个名为“已更改”的变量'这是假的。当其中一个选择框被更改'更改'变得真实......

这有效,我有一个控制台日志,它显示了它的工作情况,但是当按下提交按钮时,它会调用该功能来显示分数或警告,它似乎并没有意识到这一点,'改变'已更改为TRUE。

继承人Jquery ......

var changed = false;

$('select').on('change', function () {

var changed = true;
console.log('TRUE');

});

$("#button").click( function(){

var correct = 0;

var selectValue;

var questions = document.getElementsByClassName("question");

var numOfQuestions = questions.length;

for(var i = 0; i < questions.length; i++ ){//begin for loop

//get the value of the select element
selectValue =  questions[i].options[questions[i].selectedIndex].value;

//if the value equals right
if(selectValue === "right"){//begin if then

//increment the correct variable
correct++;

}//end if then

}//end for loop



if(changed === false){
$('#scoreDisplay span').append('WARNING');
}
else{  

$('#scoreDisplay span').append(correct);

}
});

你可以在这里看到它,但你会看到它只显示&#39;警告&#39;当您点击提交时,无论您是否更改了任何选择框... http://gogeye.com/connectquiz/index.html

2 个答案:

答案 0 :(得分:2)

在此事件处理程序中重新定义var changed

$('select').on('change', function () {

    // creates a new local variable that is only available inside this function
    var changed = true;
    console.log('TRUE');

});

创建一个新的局部变量,用于“遮蔽”和“隐藏”在更高范围内声明的changed变量。

从函数内部删除var,因此它不会创建该名称的新变量,而只是设置更高范围的变量:

var changed = false;

$('select').on('change', function () {

    // no var in front of this variable so you are just setting
    // the earlier one, not creating a new one
    changed = true;
    console.log('TRUE');

});

请记住,只要在函数内部声明带有var的变量,它就会定义一个仅在该函数中可用的新局部变量。如果碰巧与更高范围内的变量具有相同的名称,则它会覆盖该变量名称,并且解释器在您引用它时使用本地变量而不是更高范围的变量名称。

Javascript解释执行范围搜索以解析变量引用。首先,它在本地范围内查找。如果在那里找到它,那么它使用它在那里找到的那​​个。如果在那里找不到它,那么它会查看下一个更高的范围。如果没有找到它,它会达到更高的范围,直到它达到全局范围。因此,它找到变量名称的最近范围是使用的范围 - 因此将首先使用varlet定义的局部变量。

答案 1 :(得分:0)

从'var changed = true'

中删除'var'
var changed = false;

$('select').on('change', function () {    
  changed = true;
  console.log('TRUE');    
});