1、let命令
- 不存在變量提高。es5的
var
會存在變量提高問題,可是es6的let
和const
不會存在變量提高問題。
- 暫時性死區。只要在塊級做用域內存在
let
命令,它所聲明的變量就綁定在這個區域,再也不受外部的影響。es6明確規定,若是區塊中存在let
和const
命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域,凡是在聲明以前就使用這些變量,就會報錯。即便是使用typeof
也會報錯。
var tmp = 123;
if(true){
tmp = "abc";
let tmp;
}
複製代碼
- 不容許重複聲明。
let
和const
不容許在相同的做用域內,重複聲明同一個變量。
function func() {
let a = 10;
var a = 1;
}
function func() {
let a = 10;
let a = 1;
}
function func(arg) {
let arg;
}
function func(arg) {
{
let arg;
}
}
複製代碼
2、塊級做用域
- es5只有全局做用域和函數做用域,沒有塊級做用域。這可能致使不少不合理的場景。
var tmp = 123;
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f();
複製代碼
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i);
複製代碼
- es6的塊級做用域
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n);
}
複製代碼
- es6容許塊級做用域的任意嵌套,塊級做用域的出現,使得普遍應用的當即執行函數表達式(IIFE)再也不必要,塊級做用域不返回值,除非它是全局變量。
(function () {
var tmp = ...;
...
}());
{
let tmp = ...;
...
}
複製代碼
3、const命令
const
聲明一個只讀的常量,一旦聲明,常量的值就不能改變。
const
一旦聲明變量,就必須當即初始化,不能留到之後賦值。
const
限定的是賦值行爲。
const a = 1;
a = 2;
const arr = [];
arr.push(1)
arr = [];
複製代碼
4、頂層對象屬性與全局變量
- 頂層對象,在瀏覽器環境指的是
window
對象,在 node 指的是global
對象。ES5 之中,頂層對象的屬性與全局變量是等價的。
window.a = 1;
a
a = 2;
window.a
複製代碼
- es6中引入的
let
、const
、class
聲明的全局變量再也不屬於頂層對象的屬性。可是var
、function
聲明的變量依然屬於全局對象的屬性。
var a = 1;
window.a
let b = 1;
window.b
複製代碼