JavaScript比较返回相同和不同的

时间:2015-05-27 10:10:50

标签: javascript php

我正在比较Current Sub和New Sub。它从php文件中获取CurrentSub并等待4秒,然后从同一文件中获取NewSub

当我运行此代码时,它会弹出警报,因为它是相同的,并且它的警报是不同的。

我不明白它是如何相同但又不同?我打印放在屏幕上的变量,它们是相同的。

任何帮助将不胜感激。

setInterval(function() {
    var CurrentSub = "<?php echo $Name[1] ; ?>";
    setTimeout(function() {
        var NewSub = "<?php echo $Name[1] ; ?>";
        if (NewSub != CurrentSub) {
            window.alert("different");
            setTimeout(function() {
                $('.subText').html(NewSub);
            }, 200)

            document.getElementById("Sub1Move").style.display = "block";
            document.getElementById("Sub1").style.display = "none";
            $("#Sub1Move").animate({
                marginTop: "-=34px",
            }, 1900, function() {
                document.getElementById("Sub1").style.display = "block";
            });
            setTimeout(function() {
                $("#Sub1Move").stop();
                document.getElementById("Sub1").style.display = "block";
                document.getElementById("Sub1Move").style.display = "none";
                document.getElementById("Sub1Move").style.marginTop = "34px";

            }, 2000);
            var CurrentSub = "<?php echo $Name[1] ; ?>";
        };
        if (NewSub == CurrentSub) {
            window.alert("same");
        };
    }, 4000);

    $('.test').html(NewSub);
    $('.test1').html(CurrentSub);

}, 500);

setTimeout(function() {
    $('.subText').html(CurrentSub);
}, 200);

3 个答案:

答案 0 :(得分:0)

第一个语句在执行之前执行:

if (NewSub != CurrentSub) {

以便显示不同的警报。 然后在最后有:

var CurrentSub = "<?php echo $Name[1] ; ?>";

所以现在CurrentSub和NewSub是相同的,所以正确的if语句评估为true:

if (NewSub == CurrentSub) {

答案 1 :(得分:0)

您的setIntervalsetTimeout正在创造竞争条件。您在每个setTimeout调用时创建的新setInterval为4秒。最后,在执行第一个setTimeouts之前,有8个新setInterval被调用。这是每个setTimeout花费500毫秒而嵌套setInterval花费4秒的结果。基本上,这段代码闻起来是因为你必须在它们已经改变时继续比较。在最后一个完成之前,尽量不要执行新的setInterval。因此,要么延长setTimeout超时,要么缩短嵌套 <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> <AjaxSettings> <telerik:AjaxSetting AjaxControlID="rbtn_generate"> <UpdatedControls> <telerik:AjaxUpdatedControl ControlID="GV_Shift_employees" /> </UpdatedControls> </telerik:AjaxSetting> </telerik:RadAjaxManager>

答案 2 :(得分:0)

问题是闭包中引用的变量。 和悬挂声明 你的代码就是这样的东西。

function scope1(){
    var CurrentSub // local 1
    function scope2()
    {
       var NewSub // local 2
       if(NewSub comparison CurrentSub)//you think you are referring to "local 1" but since you are redeclaring it on this function  you are actually referring to "local 3"
       {
            CurrentSub IS undefined at this point
       }
       var CurrentSub // local 3 .. redeclaration of a var in local scope, is created as undefined in the beginning of the scope, only to be defined at this point
    }
}

最简单的解决方案是从第二个var中删除var CurrentSub以允许函数引用外部变量,而不是为内部范围创建新的。