在自己的循环中使用i的函数和子函数循环 - var的行为类似于let?

时间:2016-03-25 07:39:36

标签: javascript

我正在做一个测试,var i在父函数和子函数的循环中使用。

这是我的代码:



<html>
	<head>
		<script>
			var gArr = ['a', 'b', 'c'];

			function ix(a) {
				for (var i = 0; i < gArr.length; i++) {
					document.body.innerHTML += '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i from ix: ' + i;
					if (gArr[i] == a) {
						return a;
					}
				}
			}

			function blah(newAdds) {

				for (var i = 0; i < newAdds.length; i++) {
					document.body.innerHTML += '<br>i from blah: ' + i;
					var cEntry = ix(newAdds[i]);
					document.body.innerHTML += '<br>&nbsp;&nbsp;i from blah post ix: ' + i;
					if (!cEntry) {
						gArr.push(newAdds[i]);
					}
				}

			}

			window.onload = blah.bind(null, ['d', 'e']);
		</script>
	</head>
	<body>
	</body>
</html>
&#13;
&#13;
&#13;

此代码的输出为:

i from blah: 0
     i from ix: 0
     i from ix: 1
     i from ix: 2
  i from blah post ix: 0
i from blah: 1
     i from ix: 0
     i from ix: 1
     i from ix: 2
     i from ix: 3
  i from blah post ix: 1

因为函数ix也使用了var i我希望覆盖i from blah post ix作为i的最终ix3 { {1}}在上述情况中。但事实并非如此。

这是预期的行为吗?我认为let应该给我们这种行为而不是var

2 个答案:

答案 0 :(得分:1)

您正在重新声明var i

如果您在顶部声明一次,那么我认为它符合您的意思(我认为)

请参阅下面的代码段

<html>
	<head>
		<script>
			var gArr = ['a', 'b', 'c'];
                        var i; /* <-- declare it here */
			function ix(a) {
				for (i = 0; i < gArr.length; i++) {
					document.body.innerHTML += '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i from ix: ' + i;
					if (gArr[i] == a) {
						return a;
					}
				}
			}

			function blah(newAdds) {

				for (i = 0; i < newAdds.length; i++) {
					document.body.innerHTML += '<br>i from blah: ' + i;
					var cEntry = ix(newAdds[i]);
					document.body.innerHTML += '<br>&nbsp;&nbsp;i from blah post ix: ' + i;
					if (!cEntry) {
						gArr.push(newAdds[i]);
					}
				}

			}

			window.onload = blah.bind(null, ['d', 'e']);
		</script>
	</head>
	<body>
	</body>
</html>

答案 1 :(得分:1)

功能级别的Javascript范围

重置值的原因是它们在两个不同的函数中声明,请参阅以下示例:

var f = function(){ 
    var i="12"; 
    console.log(i);
    var fn2 = function(){ 
        var i="13"; 
        console.log(i);
    }; 
    fn2(); 
    console.log(i); 
};

结果将是

 12
 13
 12

因为变量在函数级别作用域,内部变量i与父函数中的变量不同。