發佈自 Kindem的博客,歡迎你們轉載,可是要注意註明出處。另外,該文章收納在 Kindem的我的的 IT 知識整理倉庫,歡迎 Star、Fork、投稿
let
是在ES6
加入的新的變量聲明方法,let
聲明變量的方法和var
相似:javascript
let a = 'hello'; var b = 'hello';
let
的功能是聲明一個做用域被限制在塊級的變量,而var
聲明的變量的做用域只能是全局的或者整個函數塊的java
function varTest() { var x = 1; if (true) { var x = 2; // 2 console.log(x); } // 2 console.log(x); } function letTest() { let x = 1; if (true) { let x = 2; // 2 console.log(x); } // 1 console.log(x); }
再舉一個例子:git
var a = 1; var b = 2; if (a === 1) { var a = 11; let b = 22; // 11 console.log(a); // 22 console.log(b); } // 11 console.log(a); // 2 console.log(b);
另外,若是做用域位於程序的頂層,var
會掛載到window
上,而let
不會:github
var a = 'a'; let b = 'b'; // this -> window // a console.log(this.a); // undefined console.log(this.b); // a console.log(window.a); // undefined console.log(window.b);
在相同的函數或塊做用域內從新聲明同一個變量會引起一個重複定義的SyntaxError
函數
if (x) { let foo; // SyntaxError let foo; }
let
和var
都會在聲明所在的做用域頂部被建立,這被稱爲變量提高
,可是不一樣的是var
的建立會伴隨着一個undefined
值,在賦值以後纔會改變,而let
沒有被賦值以前是不會被初始化的,若是在這期間引用let
聲明的變量,會致使一個ReferenceError
,直到初始化以前,該變量都處於暫存死區
:this
function test() { // undefined console.log(bar); // ReferenceError console.log(foo); var bar = 1; let foo = 2; } test();
兩個複雜一點的例子:code
function test(){ var foo = 33; if (true) { // ReferenceError let foo = (foo + 55); } } test();
function go(n) { // Object {a: [1,2,3]} console.log(n); // ReferenceError for (let n of n.a) { console.log(n); } } go({a: [1, 2, 3]});
const
的基本做用是聲明一個做用域被限制在塊級的常量,其做用域和let
同樣,基本使用也和let
相似,可是const
的特色是const
聲明的值一經建立沒法被改變對象
使用const
會建立一個值的只讀引用,這意味着const
聲明的對象本省的引用是沒法被改變的,可是其屬性是能夠被改變的,由於改變其屬性並不會引發其引用的變化ip
下面給出const
的一些特性的例子:作用域
基本使用:
const a = 'abc';
沒法被重複定義:
const a = 'abc'; // SyntaxError: Identifier 'a' has already been declared const a = 'abc';
聲明時就必須賦值:
// SyntaxError: Missing initializer in const declaration const a;
沒法被修改:
const a = 'a'; // TypeError: Assignment to constant variable a = 'b';
塊級做用域:
if (true) { var a = 'a'; const b = 'b'; // a console.log(a); // b console.log(b); } // a console.log(a); // ReferenceError: not defined console.log(b);
做用域在程序頂層時不會掛在window
對象上:
var a = 'a'; const b = 'b'; // this -> window // a console.log(this.a); // undefined console.log(this.b); // a console.log(window.a); // undefined console.log(window.b);