for循环问题

for(var i=0;i<10;i++){};
console.log(i) //10

这段代码为什么循环体外面能访问到里面定义的i?
那如果像下面这样出现两个相同的循环又不会报错?按道理第二次var i=0;应该会报错的啊?

for(var i=0;i<10;i++){};
...
for(var i=0;i<10;i++){};

如果上面用let我还可以理解,求解为什么,用var 不会污染全局变量吗??

for(let i=0;i<10;i++){};
console.log(i) //undefined
阅读 3.8k
7 个回答

var 可以重复定义。

js 变量只有两个作用于:全局函数

js 并没有块级作用域,所以即使写在 if/else/while/for 里面的,或者写在大括号里面的,都不是块级作用域(因为js 根本就没有块级作用域),所以你第一代代码的 i 是全局的。

var 不会污染全局变量吗?

确实污染全局变量。但是变量可以重复使用 var 进行定义,所以不会报错。

新手上路,请多包涵

变量的作用域!建议查看var和let的区别

var没有block scope

var不存在块级作用域,重复声明也不会有问题,会变量提升。
let是块级作用域,并且不会变量提升,提前声明,但是存在死区。

// 第一段
var i;
for(i=0;i<10;i++){};
console.log(i) //10
// 第二段
var i;
for(i=0;i<10;i++){};
...
for(i=0;i<10;i++){};

var有变量提升。
如果想循环结束后访问不到i,请使用let

楼主去看一下varlet的区别,js是没有块级作用域的,只有函数作用域和全局作用域,用了let才会有块级作用域,此外,var存在变量提升,你不管在哪里定义 一个变量var i,赋值 var i=0,都会吧 var i 定义这个变量的语句提升到当前作用域的顶部,可以重复声明

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题