全局变量不会改变它们的值。具体来说,pageNumber保持为1,并且它应该在函数中递增。我尝试实现连续滚动并获取下一个代码块,在我的asp.net mvc控制器中使用post query to action,但它当然总能得到我相同的结果
<script type="text/javascript">
pageNumber = 1; //Infinite Scroll starts from second block
noMoreData = false;
inProgress = false;
function ScrollFunction(pageNumber, noMoreData, inProgress) {
var documentHeight = $(document).height();
var windowHeight = $(window).height();
var windowScrollTop = $(window).scrollTop();
var documentMinusWindowHeight = documentHeight - windowHeight;
//-1 because when scroll reaches the bottom of the document windowScrollTop - documentHeightMinusWindowHeight equals from zero to 1
if ((windowScrollTop > documentMinusWindowHeight - 1) && !noMoreData && !inProgress) {
inProgress = true;
$("#loadingDiv").show();
$.post("@Url.Action("InfiniteScroll", "Products")", { "productId": '@Model.ProductViewModel.Id', "pageNumber": pageNumber },
function (data) {
pageNumber++;
noMoreData = data.NoMoreData;
$("#ProductDealsPartialDiv").append(data.HtmlString);
$("#loadingDiv").hide();
inProgress = false;
});
}
}
$(document).ready(function () {
//var pageNumber = 1;
//var noMoreData = false;
//var inProgress = false;
ScrollFunction(pageNumber, noMoreData, inProgress);
$(window).scroll(function () {
ScrollFunction(pageNumber, noMoreData, inProgress);
});
});
</script>
&#13;
但是这段代码片段绝对正确。
<script type="text/javascript">
$(document).ready(function () {
var pageNumber = 1; //Infinite Scroll starts from second block
var noMoreData = false;
var inProgress = false;
$(window).scroll(function () {
var documentHeight = $(document).height();
var windowHeight = $(window).height();
var windowScrollTop = $(window).scrollTop();
var documentMinusWindowHeight = documentHeight - windowHeight;
//-1 because when scroll reaches the bottom of the document windowScrollTop - documentHeightMinusWindowHeight equals from zero to 1
if ((windowScrollTop > documentMinusWindowHeight - 1) && !noMoreData && !inProgress) {
inProgress = true;
$("#loadingDiv").show();
$.post("@Url.Action("InfiniteScroll", "Products")", { "productId": '@Model.ProductViewModel.Id', "pageNumber": pageNumber },
function (data) {
pageNumber++;
noMoreData = data.NoMoreData;
$("#ProductDealsPartialDiv").append(data.HtmlString);
$("#loadingDiv").hide();
inProgress = false;
});
}
});
});
</script>
&#13;
答案 0 :(得分:1)
这是因为您的函数ScrollFunction
的第一个参数称为pageNumber
。
因此,当您调用它时,该函数会操纵名为pageNumber
的局部变量,而该变量不是全局变量。原始类型(如整数或字符串)不是通过引用传递,而是通过值传递,这意味着更改本地pageNumber
不会影响全局类型。
看看这些例子:
function change(glob) {
glob = 2;
}
var glob = 1;
change(glob);
在此调用之后,glob仍然等于1,这正是代码中发生的事情。确实,我们决定将这个论点称为&#34; glob&#34;但它可能是任何东西:
function change(localParameter) {
localParameter = 2;
}
var glob = 1;
change(glob);
在这个例子中,我假设您理解调用change
不应该影响您的全局变量。即使变量名称相同,上面也会发生同样的情况。
现在要避免这种情况并直接在全局变量上工作,您所要做的就是使用函数中的变量而不是通过参数传递它:
function change() {
glob = 2;
}
var glob = 1;
change();
现在glob等于2,因为该函数可以直接访问超出其范围的变量。我们称之为关闭变量。
答案 1 :(得分:0)
了解about pass-by-value and pass-by-reference。
当您使用pageNumber值调用方法时,它是值传递,这意味着它会创建值的本地副本,而不是更改原始变量。
在JS中,您需要传递一个对象来实现pass-by-reference,并能够在函数内更改其值。