我将以下代码输入Chrome的javascript控制台:
function test() {
var a = [1, 2, 3, 4];
for (var i = 0; i < a.length; i++) {
var a = i;
console.log(a);
}
console.log(a);
}
test();
当我调用test()时,我没有获得值0,1,2,3
,而是获得0
两次。它似乎循环只运行一次,有谁知道为什么?
答案 0 :(得分:3)
这是因为你在循环和外部使用相同的变量a
。此代码可以正常工作,如您所愿:
function test() {
var a = [1, 2, 3, 4];
for (var i = 0; i < a.length; i++) {
var b = i;
console.log(b);
}
console.log(a);
}
test();
答案 1 :(得分:3)
变量声明(var a
等)是&#34;悬挂&#34;在功能里面。 for
循环没有单独的范围。忽略var
的第二次使用,并在循环的第一次迭代内覆盖自相同的a
。由于a
现在等于0
,因此循环结束。
您可以在此处详细了解吊装: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明它。这也意味着变量可以在声明之前使用。此行为称为&#34; hoisting&#34;,因为看起来变量声明被移动到函数或全局代码的顶部。
出于这个原因,建议始终在其作用域的顶部(全局代码的顶部和函数代码的顶部)声明变量,以便清楚哪些变量是函数作用域(本地)以及哪些变量在范围链上得到解决。
答案 2 :(得分:2)
这是因为你要覆盖你的变量a
。因此,在第一次迭代中,您将a
从array
更改为0
。在下一次迭代中,a
没有属性length
和循环中断。所以你得到0
两次。
function test() {
var a = [1, 2, 3, 4];
var len = a.length;
for (var i = 0; i < len; i++) {
var a = i;
console.log(a);
}
console.log(a);
}
test();
更好的方法:
function test() {
var a = [1, 2, 3, 4];
for (var i = 0; i < a.length; i++) {
console.log(i);
}
console.log(a);
}
test();