资讯专栏INFORMATION COLUMN

for 循环 var 和 let

shengguo / 1316人阅读

摘要:纯属个人理解,如有问题还请指出在声明的内存在一个变量,会存在引擎内部。

纯属个人理解,如有问题还请指出~

在声明的()内存在一个变量 i,会存在 JavaScript 引擎内部。 每一次循环的时候, JavaScript 引擎内部会记住上一轮循环的值,然后将新的 i 的值赋值给 i

for (let i = 0; i < 3; i++) {
  let i = "abc";
  console.log(i);
}
//abc
//abc
//abc

由于let块级作用域,for()内的let 相当于有个隐藏的父作用域,for{}循环体内的let 是新的子作用域,重新声明一个 i;不会影响()里 i 的值

for (let i = 0; i < 3; i++) {
  i = "abc";
  console.log(i);
}
//abc

但是如果不声明 i,直接给 i 赋值,会影响()里 i 的值,说明()是循环体的上一级作用域,在循环体里直接改变 i 的值会影响上一级作用域里的 i 值

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

相当于
1 先var i;
2 再执行 for 循环
3 第一次 i = 0 满足条件 进入循环体,由于 var 没有块级作用域的概念,所以会重新声明修改for循环外全局作用域的 i 的值,从而影响了循环变量的值,导致后面条件不满足进入不到循环体,所以只输出一次

for (var i = 0; i < 3; i++) {
  let i = "abc";
  console.log(i);
}
//abc
//abc
//abc

循环变量 i 是全局作用域,循环体内 let i 为块级作用域内的变量,不影响全局变量,输出三次

for (let i = 0; i < 3; i++) {
  var i = "abc";
  console.log(i);
}
//Uncaught SyntaxError: Identifier "i" has already been declared

!!! 不太理解这个为什么会报错,希望懂得的小伙伴们给个指导
个人迷惑的地方:报这个错是因为在同一个作用域下重复声明变量 i,但是{}内的var i 为 全局作用域下的 i ,()内的 let i 属于()的作用域,两个不同的作用域为什么会报错呢???

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106608.html

相关文章

  • 循环中的异步&&循环中的闭包

    摘要:原文链接在这之前先要了解一下循环中和的区别是函数级作用域或者全局作用域,是块级作用域看一个例子循环中的逻辑代码函数下的输出,全局下的不存在现在我们把换为循环中的逻辑代码报错了,不在函数作用域下,当然肯定也不会再全局下因为和的这个区别当然和的 原文链接在这之前先要了解一下 for循环中let 和var的区别 var 是函数级作用域或者全局作用域,let是块级作用域看一个例子 fu...

    Near_Li 评论0 收藏0
  • ES6 系列之 let const

    摘要:块级作用域存在于函数内部块中字符和之间的区域和块级声明用于声明在指定块的作用域之外无法访问的变量。和都是块级声明的一种。值得一提的是声明不允许修改绑定,但允许修改值。这意味着当用声明对象时没有问题报错临时死区临时死区,简写为。 块级作用域的出现 通过 var 声明的变量存在变量提升的特性: if (condition) { var value = 1; } console.lo...

    PascalXie 评论0 收藏0
  • es6块级绑定之let and const全理解

    摘要:声明会组织对变量绑定和对自生值的修改,这意味着声明并不会组织对变量成员的修改。循环中的块级绑定在此处仍然可被访问输出的结果并不是预期的值而是是因为声明导致的变量的提升。全局块级绑定与不同于的另一个方面是在全局作用域上的表现。 变量声明一直是js工作中最微妙的一部分,它不像C语言一样,变量总是在被它创建的时候声明,js语言可以允许你在你需要声明变量的时候进行声明。 var let co...

    TigerChain 评论0 收藏0
  • 深入理解ES6 - var-let-const

    摘要:声明变量不存在变量提升。临时死区,而且不能在声明之前访问它。禁止重复声明相同的变量,否则报错。不存在变量提升,一旦执行快外就会立即销毁。声明不允许修改绑定,但允许修改值,也就是说用创建对象后,可以修改该对象的属性值。 知识点 var 声明变量: 1、存在变量提升,实际上var无论在哪里声明,都会被当做当前的作用域顶部声明变量。 2、可以重复声明,后声明的变量会覆盖前声明的变量。 let...

    alexnevsky 评论0 收藏0
  • es6--letconst

    摘要:同时这个变量立即被初始化,初始值为当语句执行到赋值语句时,这个变量改变其初始值。对一个还未初始化的变量进行操作将会引起。循环和循环使用申明变量时和循环一样。的运行过程和三者的表现和在循环过程中相似。 let和const 标签(空格分隔): es6 let命令 这个命令是用来申明变量的,但是和es5不同的是,用它来声明的变量是局部变量,存在于局部作用域(blocked scope): ...

    lufficc 评论0 收藏0

发表评论

0条评论

shengguo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<