JavaScript 堆栈,后进先出堆栈:值不符合预期

JavaScript stack, LIFO stack: value not as expected

我有以下代码。

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');
    })
}

现在我将快速 运行-通过这段代码 运行s 发生的事情。

第一次点击链接运行秒:

initialIn = 'm2'

initialOut = 'm1'

backIn = 'Home'

clickBack 还没有 运行。

第二次clickLinks运行s:

initialIn = 'm7'

initialOut = 'm2'

backIn = 'CentralPortfolio'

好的,此时事情应该是这样的(我预计):

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

stackMapIn = ['m1','m2']

stackback = ['Home','CentralPortfolio']

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

我在这里要做的是,当 clickLinks 运行s 时,我有一系列出现和消失的东西。有时,用户可以运行点击后退以return回到之前的状态(status)。所以,我正在使用 JavaScript stack 来跟踪它处于什么状态,因此需要 return.

问题是,我可以 运行 clickLinks 一次,ClickBack 一次,没有问题。我什至可以 运行 clickLinks 第二次,并且仍然点击后退按钮 2 次(到 return 开始)没有问题。但是我还是不明白为什么此时 stackBack[0] (应该是栈顶?) = "Home"而不是“CentralPortfolio”。

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


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

Now we run clickBack... Why does the alert output "Home"??`

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

stackback = ['Home','CentralPortfolio']

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

using JavaScript stack

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

对其进行索引

当您 push 数组时,您将一个元素添加到数组的 末尾 。换句话说,它最终成为索引 yourArray.length - 1 处的最后一个元素。当您 pop 时,您再次从数组中取出最后一个元素。所以弹出 stackback 会返回 CentralPortfolio,当然,第一个元素不变。