我正在做一个测试,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> 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> 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;
此代码的输出为:
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
的最终ix
值3
{ {1}}在上述情况中。但事实并非如此。
这是预期的行为吗?我认为let
应该给我们这种行为而不是var
?
答案 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> 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> 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
与父函数中的变量不同。