【问题标题】:Function not picking up changed variable, is it not global?函数没有拾取改变的变量,它不是全局的吗?
【发布时间】:2016-05-04 06:21:44
【问题描述】:

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

我设置了一个名为“changed”的变量,它是假的。当其中一个选择框被更改时,“已更改”变为真......

这有效,我有一个控制台日志显示它的工作,但是当按下提交按钮时,它调用函数来显示分数或警告它似乎没有识别出“已更改”已更改为真的。

这是 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);

}
});

你可以在这里看到它,但是当你点击提交时你会看到它只是显示“警告”,不管你是否改变了任何选择框...http://gogeye.com/connectquiz/index.html

【问题讨论】:

  • var changed = true; 更改为changed = true;。你在本地范围内重新声明它。
  • 按照@Aeolingamenfel 所说的去做。原因是当你在它前面放一个 var 时,你会创建一个同名的本地版本,而 javascript 默认使用本地版本而不是全局版本。

标签: javascript jquery html


【解决方案1】:

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 定义的局部变量。

【讨论】:

    【解决方案2】:

    从“var changed = true”中删除“var”

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

    【讨论】:

    • 纯代码答案没有用。你改变了什么?为什么?它有什么不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2019-09-15
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多