JS函数返回应该为true的false变量

时间:2014-02-28 12:23:59

标签: javascript jquery variables

我遇到了返回变量状态的问题。我有函数“altFormValidate”。基本上问题在于,当我调用它时,如果蜜罐计数为0,则验证运行正常,并且“validationResult”变量返回true,但如果蜜罐计数大于0,则“validationResult”变量仍返回false,甚至在执行应该成功的代码之后。

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但是然后执行相关代码才能使其成为真?我在想这个问题是我返回validationResult变量的地方。

2 个答案:

答案 0 :(得分:3)

我没有测试它,但我猜是

if (!honeyPotCount > 0)

不同
if (!(honeyPotCount > 0))

答案 1 :(得分:2)

if (!honeyPotCount > 0)没有按照您的想法行事。它恰恰相反。

如果honeyPotCount0,则会返回true,否则会返回false

Logical-not !的{​​{3}}高于>。所以这就是你的if语句中实际发生的事情:

  • 它需要honeyPotCount并将其强制转换为布尔值,然后将其反转。
    • !0返回true
    • !-1!1!2等返回false
  • 然后该布尔值为precedence,因此可以将其与0进行比较。
    • 因此,如果honeyPostCount === 0!honeyPotCount === truetrue == 11 > 0 === true
    • 但是,如果honeyPostCount === 1!honeyPotCount === falsefalse == 00 > 0 === false

您可以通过添加括号来覆盖优先级if (!(honeyPotCount > 0)),意思是“如果honeyPotCount不大于0”,则可以修复它。 但是从逻辑中删除否定并将其更改为if (honeyPotCount < 1)会更具可读性,这意味着“如果honeyPotCount小于1”。 更好,您永远不会减少honeyPotCount,因此您也可以通过将其更改为if (honeyPotCount === 0)来使其更简单,更清晰。