以下代码生成以下输出。 但是有可能保持“索引”的值“8888”吗? 换句话说,如何使for-each变量成为本地变量? 代码:
var index = 8888;
console.log(index);
for ( index in a) { // by the way a.length = 5
console.log(index);
}
console.log(index);
输出:
8888
0
1
2
3
4
4
答案 0 :(得分:7)
只需更改变量的名称。
而不是
var index = 8888;
console.log(index);
for (index in a) { // by the way a.length = 5
console.log(index);
}
console.log(index);
使用
var index = 8888;
console.log(index);
for (i in a) { // by the way a.length = 5
console.log(i);
}
console.log(index);
当你编写for (index in a)
时,你创建了一个局部变量索引,它暂时覆盖了另一个变量index
。您可以更改不同于index
的任何内容的本地变量的名称,然后您就不会遇到此问题!。
答案 1 :(得分:2)
var index = 8888; // index is 8888 here
for(let index in a){ // index is 0,1,2,3,4 here
a[index];
}
// index is 8888 here again
let
使变量名仅限于它们声明的块 - 在本例中为for
块。在块结束后,index
声明的var
可再次访问。
答案 2 :(得分:1)
在Javascript中确定范围有点奇怪,因为在新范围中声明的变量将不先前在先前范围中声明的影子变量。你的问题展示了教科书中这意味着什么的例子。
最兼容的方法是在for循环中重命名变量:
var index = 8888;
console.log(index);
for (i in a) { // by the way a.length = 5
console.log(i);
}
下一个compatible way是使用forEach函数:
var array = ['a', 'b', 'c'];
array.forEach(function (current, arrayIndex) {
console.log(arrayIndex);
});
officially approved但still not be fully implemented by browsers的ECMA6方式是使用let
keyword。
var index = 8888;
console.log(index);
for ( let index in a) { // by the way a.length = 5
console.log(a[index]);
}
console.log(index); // still 8888
来自文档:
让vs var
在块内使用时,将变量的范围限制为该块。注意var的区别在于其范围在声明它的函数内部
它继续:
您可以使用let关键字在循环范围内本地绑定变量,而不是使用全局变量(使用var定义)。
let
几乎是Javascript试图通过向后兼容的方式减少搜索范围。
答案 3 :(得分:1)
如果必须使用相同的名称,则应使用自动执行的匿名JavaScript函数
var index = 8888;
var a =[1,2,3,4,5];
console.log(index);
(function(){
for (var index in a) { // by the way a.length = 5
console.log(index);
}
}());
console.log(index);
答案 4 :(得分:1)
请参阅有关foreach的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
你可以有这样的东西并避免使用你自己的索引变量(下面的arrayIndex变量是forEach中回调函数的本地变量):
var array = ['a', 'b', 'c'];
array.forEach(function (current, arrayIndex) {
console.log(arrayIndex);
});