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')因此,显示的是“主页”后退按钮(同时显示正确的其他内容根据 mapOut 和 mapIn) 而不是 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 数组,但像堆栈一样使用它。除非你像数组一样索引它 - 这是你混淆的根源。您可以将它用作 pop
和 push
的堆栈,但不要尝试使用 []
对其进行索引
当您 push
数组时,您将一个元素添加到数组的 末尾 。换句话说,它最终成为索引 yourArray.length - 1
处的最后一个元素。当您 pop
时,您再次从数组中取出最后一个元素。所以弹出 stackback
会返回 CentralPortfolio
,当然,第一个元素不变。
我有以下代码。
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')因此,显示的是“主页”后退按钮(同时显示正确的其他内容根据 mapOut 和 mapIn) 而不是 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 数组,但像堆栈一样使用它。除非你像数组一样索引它 - 这是你混淆的根源。您可以将它用作 pop
和 push
的堆栈,但不要尝试使用 []
当您 push
数组时,您将一个元素添加到数组的 末尾 。换句话说,它最终成为索引 yourArray.length - 1
处的最后一个元素。当您 pop
时,您再次从数组中取出最后一个元素。所以弹出 stackback
会返回 CentralPortfolio
,当然,第一个元素不变。