let块级作用域

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

  

原文地址:https://www.cnblogs.com/suiyueshentou/p/5685528.html