每个javascript变量

时间:2015-04-16 23:17:17

标签: javascript foreach

以下代码生成以下输出。 但是有可能保持“索引”的值“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

5 个答案:

答案 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 approvedstill 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); 
});