ES6giới thiệu Letcác biến đi kèm với block level scoping. Cho đến khi ES5chúng tôi không có block level scoping, vì vậy các biến được khai báo bên trong một khối luôn nằm trong hoistedphạm vi mức chức năng.
Về cơ bản Scopeđề cập đến nơi trong chương trình của bạn, các biến của bạn được hiển thị, xác định nơi bạn được phép sử dụng các biến bạn đã khai báo. Trong ES5chúng tôi có global scope,function scope and try/catch scope, với ES6chúng tôi cũng có được phạm vi cấp khối bằng cách sử dụng Let.
- Khi bạn xác định một biến với 
vartừ khóa, nó sẽ biết toàn bộ hàm từ thời điểm nó được xác định. 
Khi bạn xác định một biến với letcâu lệnh, nó chỉ được biết đến trong khối mà nó được xác định.
 function doSomething(arr){
     //i is known here but undefined
     //j is not known here
     console.log(i);
     console.log(j);
     for(var i=0; i<arr.length; i++){
         //i is known here
     }
     //i is known here
     //j is not known here
     console.log(i);
     console.log(j);
     for(let j=0; j<arr.length; j++){
         //j is known here
     }
     //i is known here
     //j is not known here
     console.log(i);
     console.log(j);
 }
 doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
 
Nếu bạn chạy mã, bạn có thể thấy biến jchỉ được biết trong loopvà không phải trước và sau. Tuy nhiên, biến của chúng tôi iđược biết đến entire functiontừ thời điểm nó được xác định trở đi.
Có một lợi thế lớn khác khi sử dụng let vì nó tạo ra một môi trường từ vựng mới và cũng liên kết giá trị mới hơn là giữ một tham chiếu cũ.
for(var i=1; i<6; i++){
   setTimeout(function(){
      console.log(i);
   },1000)
}
for(let i=1; i<6; i++){
   setTimeout(function(){
      console.log(i);
   },1000)
}
forVòng lặp đầu tiên luôn in giá trị cuối cùng , với letnó tạo ra một phạm vi mới và liên kết các giá trị mới in chúng tôi 1, 2, 3, 4, 5.
Về constantscơ bản, nó hoạt động cơ bản như thế let, sự khác biệt duy nhất là giá trị của chúng không thể thay đổi. Trong hằng số đột biến được cho phép nhưng không được phép gán lại.
const foo = {};
foo.bar = 42;
console.log(foo.bar); //works
const name = []
name.push("Vinoth");
console.log(name); //works
const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.
console.log(age);
Nếu một hằng đề cập đến một object, nó sẽ luôn luôn đề cập đến objectnhưng objectchính nó có thể được thay đổi (nếu nó có thể thay đổi). Nếu bạn muốn có một bất biến object, bạn có thể sử dụngObject.freeze([])
               
              
let foo = () => bar; let bar = 'bar'; foo();minh họa tất cả các tuyên bố có hiệu lực thậm chí còn tốt hơn, bởi vì nó không rõ ràng do vùng chết tạm thời.