JavaScript堆栈,LIFO堆栈:值不符合预期

时间:2015-05-05 17:24:16

标签: javascript stack

我有以下代码。

var stackMapIn = [];
var stackMapOut = [];
var stackBack = [];

stackMapOut.push("m1");

$scope.clickLinks = function(initialOut,initialIn,extra,backIn,backOut,name){
        $('div#'+initialOut+'Map,'+extra).fadeOut('slow',function(){
            $('.'+initialOut+'Details,.bkbtn'+backOut).css("display","none");
            $('.'+initialIn+'Details,.bkbtn'+backIn).css("display","block");
            $('.noQuery').css("display","none");
            $("#buildingHeader").html(name);
            $('div#'+initialIn+'Map').fadeIn('slow');
        })

    stackMapOut.push(initialIn);
    stackMapIn.push(initialOut);
    stackBack.push(backIn);
}

$scope.clickBack = function(bkbtnCheck){
    alert(stackBack[0]);
    mapOut = stackMapOut.pop();
    mapIn = stackMapIn.pop();
    stackBack.pop();
    backIn = stackBack[0];
    alert(backIn);

    $('div#'+mapOut+'Map').fadeOut('slow',function(){
        $('.'+ mapOut + 'Details,.bkbtn').css("display", "none");
        $('.' + mapIn + 'Details,.bkbtn'+backIn).css("display", "block");
        $(".noQuery").css("display","none");
        $("#buildingHeader").html("Name");
        $('div#' + mapIn + 'Map').fadeIn('slow');
    })
}

现在,我将快速浏览一下此代码运行时会发生什么。

第一次点击链接运行:

  

initialIn ='m2'

     

initialOut ='m1'

     

backIn ='主页'

clickBack 尚未运行。

第二次 clickLinks 运行:

  

initialIn ='m7'

     

initialOut ='m2'

     

backIn ='CentralPortfolio'

好的,所以在这一点上应该看起来像这样(我期待):

  

stackMapOut = ['m1','m2','m7']

     

stackMapIn = ['m1','m2']

     

stackback = ['Home','CentralPortfolio']

现在我们运行 clickBack ...为什么警报输出“Home”??

我想在这里做的是,当 clickLinks 运行时,我有一系列事物出现并消失。有时,用户可以运行 clickBack 以返回先前的状态(状态)。所以,我正在使用 JavaScript堆栈来跟踪它所处的状态,以及它需要返回的位置。

问题是,我可以运行 clickLinks 一次,clickBack连续一次没有问题。我甚至可以再次运行 clickLinks ,仍然可以单击后退按钮2次(返回开始)而不会出现问题。但我仍然不明白为什么 stackBack [0] (应该是堆栈的顶部?) =“Home”此时而不是“CentralPortfolio”。

因为我遇到了真正的问题,如果我第三次运行 clickLinks :仍然 stackBack [0] ='Home'(当我希望它时此时是“CentralCampus”)因此,它显示的是“Home”后退按钮(正确的其他内容按照 mapOut mapIn 显示)而不是CentralPortfolio'后退按钮显示;因为我在使用它之前“弹出”了“CentralCampus”。

如果需要任何其他信息,或者您需要更多说明,请告知我们。我尽力提供任何所需的信息,并尽可能清楚。

1 个答案:

答案 0 :(得分:2)

  

现在我们运行clickBack ...为什么警报输出" Home" ??`

因为stackBack[0]Home。你期望它做什么?你甚至在你的问题中都有它:

stackback = ['Home','CentralPortfolio']

索引0是数组中的第一个元素,即Home。最后一个元素是stackBack[stackBack.length - 1]

  

使用JavaScript堆栈

不,你使用的是javascript数组,但是像堆栈一样使用它。除非您将其索引为数组 - 这是您混淆的根源。您可以将其用作poppush的堆栈,但不要尝试使用[]

进行索引

当你在数组上push时,你会向数组的结尾添加一个元素。换句话说,它最终成为索引yourArray.length - 1的最后一个元素。当你pop时,你再次从阵列中取出最后一个元素。因此,弹出stackback将会返回CentralPortfolio,当然,第一个元素不会改变。