在es6入门时,最让人傻傻分不清楚的就是var与let带来的作用域的苦恼。最近又一次翻看阮一峰老师的文章,重新有了自己的小结。
- 代码分析
var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10
var a = [];for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 6
以上两段代码区别在于var与let使用的作用域不同。
1.var 变量的作用域是全局,而let 是局部的块作用域即for循环内。2.明确循环内部的i与console.log(i)中的i是在不同的作用域中,它们有各自单独的作用域。3.全局变量唯一性,var 声明的变量i在循环中被不断覆盖最终只是唯一的10,因此在外部调用中无论调用a数组的哪一个,最终都是10。4.局部使用 let 定义时只在该函数作用域内部有效。例子如下:for (let i = 0; i < 10; i++) { // ...}console.log(i);// ReferenceError: i is not defined
个人小结,如有错误,望各位大佬指正。