为什么全局变量没有改变?

时间:2016-01-28 11:18:21

标签: javascript asp.net-mvc

全局变量不会改变它们的值。具体来说,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;
&#13;
&#13;

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

&#13;
&#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;
&#13;
&#13; 请解释为什么会这样。感谢。

2 个答案:

答案 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,并能够在函数内更改其值。

相关问题