let是es6中新加的作用域,即块级作用域。
var申明的变量要么全局,要么函数级,而let允许把变量的作用域限制在块级域中,这里的块级可以是()内,或{}内。
示例:
code_1:
1 "use strict"; 2 var a = []; 3 for(let i=0; i<10; i++){ 4 a[i] = function(){ 5 console.log(i); 6 } 7 } 8 a[6]();//结果为6
code_2:
1 var a = []; 2 for(var i=0; i<10; i++){ 3 a[i] = function(){ 4 console.log(i); 5 } 6 } 7 a[6]();//结果为10
code_3:
1 var a = []; 2 for (var i = 0; i < 10; i++) 3 (function(c) { 4 a[i] = function() { 5 console.log(c); 6 } 7 }(i)); 8 a[6]();//结果为6
在code_2中,由var定义的变量 i 是一个全局变量,每次循环的时候 i 都会被覆盖,而for循环体内的a[i]只是定义了一个函数,函数内部的打印的 i 在使用前还是一个变量,并不是固定的值,循环结束,全局变量 i = 10,所以最后调用a[6]()时打印的结果为10。在code_1中,由let定义的变量 i 在块级作用域内,每次循环时,a[i]函数中的 i 不会再改变,所以循环结束后打印的结果为6。code_3涉及到函数闭包,在网上看到了,就贴一下。
参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let
https://segmentfault.com/q/1010000002466776