Javascript JS函数返回应为真的假变量

Javascript JS函数返回应为真的假变量,javascript,jquery,variables,Javascript,Jquery,Variables,我对返回变量的状态有问题。我有函数“altFormValidate”。本质上,问题是当我调用它时,如果蜜罐计数为0,验证运行正常,“validationResult”变量返回true,但是如果蜜罐计数大于0,“validationResult”变量仍然返回false,即使在执行了应该使其为true的代码之后也是如此 function altFormValidate(intendedFormID){ //Validate honeypot traps var validationResul

我对返回变量的状态有问题。我有函数“altFormValidate”。本质上,问题是当我调用它时,如果蜜罐计数为0,验证运行正常,“validationResult”变量返回true,但是如果蜜罐计数大于0,“validationResult”变量仍然返回false,即使在执行了应该使其为true的代码之后也是如此

function altFormValidate(intendedFormID){ //Validate honeypot traps
    var validationResult = false;
    }

    var honeyPotFields = ["Fname", "EmailAddress", "Lname", "Telephone", "Address1", "Address2", "Surname", "Title"];
    var honeyPotCount = 0;
    honeyPotFields.forEach(function(entry) { //Check page for honeypots filled out
        if($('#' + entry).length >= 1){
            var honeyPotVal = $('#' + entry).val();
            if (honeyPotVal !== ""){
                honeyPotCount = honeyPotCount + 1; //Count successful honeypot traps
            }
        }
    });
    if (!honeyPotCount > 0) //Check honeypot count
    {
        $('#' + intendedFormID).attr("action", formAction); //Append SF action to form
        validationResult = true;
    }
    else 
    {
        if (honeyPotCount == 1){ //If one honeypot filled in
            //SUSPECT - implement further checks
                $.colorbox({ //init popup with confirmation input: "#machine-check"
                href: "/inc/form-confirmation.html",
                transition: "elastic",
                speed: 350,
                opacity: 0.65,
                className: "seg-window",
                onComplete: function() {
                    jQuery('#colorbox').find('a.btn-close, a.close, a.cancel').unbind('click.closeColorbox').bind('click.closeColorbox', function(e) {
                        jQuery.colorbox.close();
                        e.preventDefault();
                    });
                    jQuery('#machine-check').bind('change', function(e) {
                            jQuery.colorbox.close();
                            e.preventDefault();
                            validationResult = true; //This code doesn't seem to change the variable "validationResult" when I call the entire function altFormValidate but I know that changing "machine-check" does change the variable. 
                        });
                    }
             });
        }
        else if (honeyPotCount == 2){ //If two honeypots filled in
            //PRIME SUSPECT - init Captcha/Akismet etc
            alert("Robot Alert!");
            validationResult = false;
        }

    } return validationResult;
}
在提交表单时,我会这样调用上述函数:

   var req = true; 
   if(req){ //If required fields are filled in
                var extraValidation = altFormValidate('WebToLeadForm', 'webToLeadPost');

                 if (extraValidation == true){
                    alert("form sent");
                    //document.WebToLeadForm.submit();
                    return true;
                }
            }

所以我的问题是,为什么extraValidation()在没有找到蜜罐的情况下返回true,而在找到蜜罐的情况下返回false,然后执行相关代码使其成为true?我想问题在于我在哪里返回validationResult变量。

我没有测试它,但我猜是这样的

if (!honeyPotCount > 0)
不一样

if (!(honeyPotCount > 0))

我没有测试,但我猜

if (!honeyPotCount > 0)
不一样

if (!(honeyPotCount > 0))
如果(!honeyPotCount>0)
不执行您认为它可以执行的操作。事实恰恰相反

如果
honeyPotCount
0
它将返回
true
,否则它将返回
false

逻辑不是
的值大于
。下面是if语句中实际发生的情况:

  • 它接受
    honeyPotCount
    并将其强制为布尔值,然后返回它的倒数。
    • !0
      返回
      true
    • -1
      !1
      !2
      ,etc返回
      false
  • 然后将该布尔值设置为0,以便与
    0
    进行比较。
    • 所以,如果honeyPostCount===0
!honeyPotCount===true
true==1
1>0===true
  • 但是,如果honeyPostCount===1,
    !honeyPotCount===false
    false==0
    0>0===false
  • 如果(!(honeyPotCount>0))表示“如果honeyPotCount不大于0”,则可以通过添加括号来覆盖优先级
    if(!(honeyPotCount>0))
    来修复此问题。 但是,从逻辑中删除否定并将其更改为if(honeyPotCount<1),这意味着“如果honeyPotCount小于1”,会更具可读性更好的是,如果(!HONEYPOTCUNT>0)没有做你认为它做的事情,你永远不会减少
    HONEYPOTCUNT
    ,因此你也可以通过将它改成
    来让它更简单更清晰。事实恰恰相反

    如果
    honeyPotCount
    0
    它将返回
    true
    ,否则它将返回
    false

    逻辑不是
    的值大于
    。下面是if语句中实际发生的情况:

    • 它接受
      honeyPotCount
      并将其强制为布尔值,然后返回它的倒数。
      • !0
        返回
        true
      • -1
        !1
        !2
        ,etc返回
        false
    • 然后将该布尔值设置为0,以便与
      0
      进行比较。
      • 所以,如果honeyPostCount===0
    !honeyPotCount===true
    true==1
    1>0===true
  • 但是,如果honeyPostCount===1
  • !honeyPotCount===false
    false==0
    0>0===false
    如果(!(honeyPotCount>0))表示“如果honeyPotCount不大于0”,则可以通过添加括号来覆盖优先级
    if(!(honeyPotCount>0))
    来修复此问题。
    但是,从逻辑中删除否定并将其更改为if(honeyPotCount<1),这意味着“如果honeyPotCount小于1”,会更具可读性更好的是,您永远不会减少
    honeyPotCount
    ,因此如果(honeyPotCount==0)异步性是一个问题,您还可以将其更改为
    ,使其更加简单和清晰。
    机器检查的
    更改处理程序将在
    altFormValidate
    返回后很长时间内启动。啊,这很有意义!那么,我如何才能使这个函数同步工作,因为只有在altForm validate函数之后,更改处理程序才会启动?你不能将异步操作转换为同步操作,你应该做相反的操作。始终防止实际的表单提交,在知道最终值时给
    altFormValidate
    一个回调函数,并在该回调函数中提交表单值。看看异步工作流一般是如何工作的。谢谢@dcoderasynchronousity,这是一个很好的描述。
    机器检查的
    更改处理程序将在
    altFormValidate
    返回后很长时间内启动。啊,这很有意义!那么,我如何才能使这个函数同步工作,因为只有在altForm validate函数之后,更改处理程序才会启动?你不能将异步操作转换为同步操作,你应该做相反的操作。始终防止实际的表单提交,在知道最终值时给
    altFormValidate
    一个回调函数,并在该回调函数中提交表单值。看看异步工作流通常是如何工作的。非常好,非常有描述性,谢谢@DCoderIt,它的可读性要差得多,但对于非负数它会产生相同的结果。我不明白这里的相关性是什么?它的可读性要差得多,但对于非负数它会产生相同的结果。我不明白这里的相关性是什么?