JavaScript中的let与var

来源:互联网 发布:吴宗宪 周杰伦 知乎 编辑:程序博客网 时间:2024/04/24 07:58

先贴两段让人匪夷所思的代码:

var a = [];for (var i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 10

上面这段代码输出的结果是10。

var a = [];for (let i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 6

上面这段代码输出的是6

这就引出了javascript中,关于let和var所定义的变量作用域区别。

先对上面两段代码进行一下解读:
第一段代码:变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。
第二段代码:变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。

var关键词的作用域是最近的函数作用域(如果在函数体的外部就是全局作用域), let 关键词的作用域是最接近的块作用域(如果在任何块意外就是全局作用域),这将会比函数作用域更小。