为什么全局变量没有改变?
全局变量不会更改它们的值。具体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>
这是因为函数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,因为函数可以直接访问超出其范围的变量。我们称之为关闭一个变量。
学习东西about pass-by-value and pass-by-reference。
当您使用pageNumber值调用方法时,它是按值传递的,这意味着它创建值的本地副本而不是更改原始变量。
在JS中,您需要传递一个对象来实现传递引用,并且能够从函数内部更改其值。
或关闭变量 – floribon
你能提供[mcve]吗? –