for(数组项)和for(数组项)之间有区别吗?

时间:2019-07-19 05:59:15

标签: javascript

这只是一个问题,在MDN或stackoverflow中搜索时未找到答案。这两个语句

for (let item of array)for (item of array)似乎完全一样。它们是否等效(即,如果变量 item 之前没有任何内容,则用let隐式声明)吗?

编辑: 这类似于this-不同之处在于,它专门询问for..of循环,而处理let关键字的答案在底部,因此可能会被遗漏。但是,这两个问题都是关于同一概念的。要点如下:

  1. 如果未在for中显式声明变量,则将其视为全局变量(如果之前未声明,则在同一函数中)。
  2. 如果用var声明,则对于声明的函数是局部的。
  3. 如果用let声明,则仅在for块本地。

2 个答案:

答案 0 :(得分:3)

如果您不在循环中使用let或var,则在全局范围内创建一个变量

var仅在函数中保持定义

let仅在循环语句中保持定义

const arr = ["One","Two","Three"]
function test1() {
  for (var a of arr) console.log(a);
  console.log("var a after loop:",a) // works
}  

function test2() {
  for (let b of arr) console.log(b);
  console.log("trying to log `let b` after loop")
  try {
    console.log("let b after loop:",b); // fails  
  }
  catch(e) { console.log("Error:",e.message)}
}  

function test3() {
  for (c of arr) console.log(c);
  console.log("'global' c after loop:",c) //works 
}  


test1(); 
test2(); 
test3(); 

// fails
console.log("Trying to log var a after function")
try { console.log("var a after function:",a);}
catch(e) { console.log("Error:",e.message)}  
console.log("Trying to log let b after function")
try { console.log("b after function:",b);}
catch(e) { console.log("Error:",e.message)}

console.log("'global' c after function:",c); // logs

答案 1 :(得分:0)

它们在功能上是等效的。但这不是一个好习惯。 确保使用letvar,因为如果您的代码变大,它将防止您得到怪异的bug或问题,就像使用item创建或引用全局变量一样。这是一颗定时炸弹