前情提要
在逛技术社区的过程中遇到这么一个问题:第一个for
循环为什么只输入一次呢?看了题主贴的代码后,感觉比较简单所以就答复了一下。答复完之后就萌发了水一篇文章的想法。
注:内容比较简单,如果喜爱点个赞,不喜勿喷。欢送在评论区内交换。如果自己观点有谬误的中央,恳请大佬多多指导,感激。
3个考验js基本功的for循环
先来看第一个for
循环:
for (var i =0; i < 3; i++) { var i = 3; console.log(i)}
思考一下,这段代码中,会打印几次?打印的内容别离是多少?
答案是只打印一次,打印的内容是 3
。那么为什么会这样呢?其实是js
的变量晋升机制导致的。至于代码的具体执行步骤,后续给出。这里先不急,再来看第二个for
循环。
for (var i =0; i < 3; i++) { const i = 3; console.log(i)}
思考一下,这段代码中,会打印几次?打印的内容别离是多少? 答案是打印3
次,打印内容都是3
。那么,这又是为什么呢?只是换了一个关键字来申明变量。竟有如此之区别?其实const
申明的变量在代码块中有作用域,并且不存在变量晋升机制。如果在const
申明之前去应用该变量会导致js
报错(阮一峰es6
中讲的暂时性死区)。
来看失常的for
循环代码
let i =0;for (; i < 3; i++) { console.log(i)}
这段代码能打印几次?打印的内容别离是?我置信在座的各位大佬应该都能给出。大佬666呀,在此膜拜。
简略讲讲js中var、let、const三个关键字的区别
先谈谈在es6
中新增的let
和const
这两个关键字。var
算是js
历史遗留的产品。都2202
年了,不会还有人在用var
吧?不会吧?不会吧?
let 关键字的个性
let
的应用和var
是差不多,和var
的区别是。
let
只会在它所申明的块中失效。请看代码:{ let a = 10; var b = 1;}a // 代码块外拜访a 会报错 ReferenceError: a is not defined.b // 代码块外拜访b,能够拿到数据 1
let
不存在变量晋升。请看代码:// var 的状况console.log(foo); // 输入undefinedvar foo = 2;// let 的状况console.log(bar); // 报错ReferenceErrorlet bar = 2;
在雷同作用域内不容许反复申明同一变量。请看代码
// 报错{ var a = 10; let a = 10;}// 报错{ let a = 1; let a = 2;}
不能在
let
变量声前应用(TDZ暂时性死区)。请看代码:{ // TDZ开始 tmp = 'abc'; // 报错: ReferenceError console.log(tmp); // 报错: ReferenceError let tmp; // TDZ完结 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
let
申明的变量会绑定以后作用,不受内部变量影响var tmp = 123;if (true) { console.log(tmp) // 报错(触发暂时性死区):ReferenceError let tmp = 'abc'; console.log(tmp) // abc}
const 关键字的个性
const
蕴含let
的所有个性,但const
申明的变量是常量,不能反复赋值。let
申明的是变量,是能够给变量反复赋值的。
const aa = 111;console.log(aa) // 111aa = 222; // 报错 TypeError: Assignment to constant variable.console.log(aa) // 111
var 关键字的个性
var
算是历史问题,目前的开发中都根本不会应用该关键字来申明变量。所以就不贴代码了,只给总结。
var
存在变量晋升- 对于
var
来讲,在function
中才有作用域。如果不在function
中那么就是全局作用域 var
能够反复申明同一变量var
能够给变量反复赋值var
能够在变量未声明之前去应用变量(变量晋升导致的)
来看看这三个for循环在js执行过程中别离都做了哪些操作
存在变量晋升的for循环
代码如下:
for (var i =0; i < 3; i++) { var i = 3; console.log(i)}
为什么存在变量晋升的for
循环只循环了一次?并且输入的内容是3
?
那么就来看看,在JS中,变量晋升是怎么一回事
- 因为变量
i
是通过var 申明的。所以i
会存在变量晋升,i
将会晋升到全局作用域中。- 在循环体内从新申明了
var i = 3
。那么var
申明的变量作用域只有function
和全局。所以这一步操作会将全局变量i
从新赋值为3
。- 进入第二次循环时,判断条件
i < 3
吗?不小于。所以循环完结了。
文字描述可能不太容易了解,这里给各位大佬上个动图:
虽存在变量晋升,但也蕴含了变量作用域的for循环
代码如下:
for (var i =0; i < 3; i++) { const i = 3; console.log(i)}
这段代码中,var
申明的变量会存在变量晋升操作。const
申明的常量则是在for
循环体内存在作用域,所以并不会影响到内部var
申明的变量。
那么这段for
循环执行了3
次,并别离打印了3
次3
。这是为什么?
该for循环的执行步骤详解
- 因为变量
var i = 0
是通过var
申明的。所以i
会存在变量晋升,i
将会晋升到全局作用域中。- 在循环体内申明了
const i = 3
。对于{}
内的代码,const、let
申明的变量时存在作用域的,所以并不会晋升到全局作用域中。- 在循环体内执行
console.log(i)
。因为是const
在循环体内申明过i
了,所以i
会绑定到以后作用域中,那么应用的时候,只会从以后作用中找i
。
文字描述可能不太容易了解,这里给各位大佬上个动图:
结尾及勘误和阐明
以上就是这篇文章的全副了,至于第三个for循环就不必开展说了,切实是日常开发中的基操。如果文章的内容有帮忙到你,欢送点赞、评论。如果有大佬发现文章内的一些谬误,恳请大佬多多指导。在此多谢大佬♀️。
- 在社区内发现的这个问答在这里:飞机票✈️(opens new window)
- 文章首发于集体博客:飞机票✈️(opens new window)
- 文章的视频解说:飞机票✈️ (opens new window),求一键三连