2016-01-28 91 views
0

全局变量不会更改它们的值。具体pageNumber保持1,它应该在一个函数中增加。我尝试实施continious滚动,并获得代码下一块,使用后查询到我的asp.net mvc的控制作用,但它当然它总是让我同样的结果为什么全局变量没有改变?

<script type="text/javascript"> 
 
\t pageNumber = 1; //Infinite Scroll starts from second block 
 
\t noMoreData = false; 
 
\t inProgress = false; 
 

 
\t function ScrollFunction(pageNumber, noMoreData, inProgress) { 
 
\t \t var documentHeight = $(document).height(); 
 
\t \t var windowHeight = $(window).height(); 
 
\t \t var windowScrollTop = $(window).scrollTop(); 
 

 
\t \t var documentMinusWindowHeight = documentHeight - windowHeight; 
 
\t \t //-1 because when scroll reaches the bottom of the document windowScrollTop - documentHeightMinusWindowHeight equals from zero to 1 
 
\t \t if ((windowScrollTop > documentMinusWindowHeight - 1) && !noMoreData && !inProgress) { 
 
\t \t \t inProgress = true; 
 
\t \t \t $("#loadingDiv").show(); 
 

 
\t \t \t $.post("@Url.Action("InfiniteScroll", "Products")", { "productId": '@Model.ProductViewModel.Id', "pageNumber": pageNumber }, 
 
\t \t function (data) { 
 
\t \t \t pageNumber++; 
 
\t \t \t noMoreData = data.NoMoreData; 
 
\t \t \t $("#ProductDealsPartialDiv").append(data.HtmlString); 
 
\t \t \t $("#loadingDiv").hide(); 
 
\t \t \t inProgress = false; 
 
\t \t }); 
 
\t } 
 
\t } 
 

 
\t $(document).ready(function() { 
 
\t \t //var pageNumber = 1; 
 
\t \t //var noMoreData = false; 
 
\t \t //var inProgress = false; 
 
\t \t ScrollFunction(pageNumber, noMoreData, inProgress); 
 
\t \t $(window).scroll(function() { 
 
\t \t \t ScrollFunction(pageNumber, noMoreData, inProgress); 
 
\t \t }); 
 

 
\t }); 
 
</script>

但是这段代码片段绝对正确。

<script type="text/javascript"> 
 
\t $(document).ready(function() { 
 
\t \t var pageNumber = 1; //Infinite Scroll starts from second block 
 
\t \t var noMoreData = false; 
 
\t \t var inProgress = false; 
 

 
\t \t $(window).scroll(function() { 
 
\t \t \t var documentHeight = $(document).height(); 
 
\t \t \t var windowHeight = $(window).height(); 
 
\t \t \t var windowScrollTop = $(window).scrollTop(); 
 

 
\t \t \t var documentMinusWindowHeight = documentHeight - windowHeight; 
 
\t \t \t //-1 because when scroll reaches the bottom of the document windowScrollTop - documentHeightMinusWindowHeight equals from zero to 1 
 
\t \t \t if ((windowScrollTop > documentMinusWindowHeight - 1) && !noMoreData && !inProgress) { 
 
\t \t \t \t inProgress = true; 
 
\t \t \t \t $("#loadingDiv").show(); 
 

 
\t \t \t \t $.post("@Url.Action("InfiniteScroll", "Products")", { "productId": '@Model.ProductViewModel.Id', "pageNumber": pageNumber }, 
 
\t \t \t \t \t function (data) { 
 
\t \t \t \t \t \t pageNumber++; 
 
\t \t \t \t \t \t noMoreData = data.NoMoreData; 
 
\t \t \t \t \t \t $("#ProductDealsPartialDiv").append(data.HtmlString); 
 
\t \t \t \t \t \t $("#loadingDiv").hide(); 
 
\t \t \t \t \t \t inProgress = false; 
 
\t \t \t \t \t }); 
 
\t \t \t } 
 
\t \t }); 
 
\t }); 
 

 
</script>
请解释为什么会发生这种情况。谢谢。

+0

你能提供[mcve]吗? –

回答

1

这是因为函数ScrollFunction的第一个参数叫做pageNumber

所以当你调用它的时候,函数操纵其局部变量pageNumber这不是全局变量。原始类型(如整数或字符串)不是通过引用传递,而是通过值传递,这意味着更改本地pageNumber不会影响全局。

看看这些例子:

function change(glob) { 
    glob = 2; 
} 

var glob = 1; 
change(glob); 

这个电话后,水珠仍然等于1,这是在你的代码发生。事实上,我们决定把争论“水珠”,但它可能是任何东西:

function change(localParameter) { 
    localParameter = 2; 
} 

var glob = 1; 
change(glob); 

在这个例子中,我假设你明白调用change不应该影响到全局变量。那么即使变量名称相同,上面也发生了同样的情况。

现在避免直接对全局变量的工作,你必须使用来自函数变量而不是参数传递给它做的事:

function change() { 
    glob = 2; 
} 

var glob = 1; 
change(); 

现在水珠是等于2,因为函数可以直接访问超出其范围的变量。我们称之为关闭一个变量。

0

学习东西about pass-by-value and pass-by-reference

当您使用pageNumber值调用方法时,它是按值传递的,这意味着它创建值的本地副本而不是更改原始变量。

在JS中,您需要传递一个对象来实现传递引用,并且能够从函数内部更改其值。

+0

或关闭变量 – floribon

相关问题