let & const 命令
原書作者:阮一峰
原書地址:ECMAScript 6入門
- let 用法
- 塊級作用域
- const 用法
- ES6 聲明變量的6中方法
- 頂層對象
1. let用法
- 基本特性
- 用于定義變量(類似于var)
- 作用域為當前代碼塊(不同于var)
{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1
- 不存在變量提升(不同于var)
- 注:在定義let變量之前,該變量不可用,稱為暫時性死區(TDZ)
// var 的情況 console.log(foo); // 輸出undefined var foo = 2; // let 的情況 console.log(bar); // 報錯ReferenceError let bar = 2; // TDZ 導致typeof不再是一個永遠不報錯的操作 typeof x; // ReferenceError let x;
- 不允許重復聲明(不同于var)
// 報錯 function func() { let a = 10; var a = 1; } // 報錯 function func() { let a = 10; let a = 1; }
- 合適場景
- for循環計數器(設置循環信息為父作用域,循環體為子作用域)
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc
2. 塊級作用域
- 引入目的
- 防止內層變量覆蓋外層變量
- 防止計數循環變量泄露為全局變量
- 塊級作用域與函數聲明
- 允許在塊級作用域聲明函數
- 函數聲明類似于var,即提升到全局作用域或函數作用域頭部
- 函數作用域會提升到所在塊級作用域的頭部
3. const用法
- 基本特性
- 用于定義常量
- 作用域為當前代碼塊
- 不存在變量提升
- 不允許重復聲明
- 注
- const特性和let很像,區別在于const聲明常量而let聲明變量
- const保證的是所指向變量的內存地址不能改變
- 對于對象和數組內部數據結構變換無法控制
4. ES6 聲明變量的6中方法
- var
- function
- let
- const
- import
- class
5. 頂層對象
- 對象屬性
- ES6中,頂層對象屬性不再與全局對象掛鉤(保留var和function不變)
var a = 1; // 如果在 Node 的 REPL 環境,可以寫成 global.a // 或者采用通用方法,寫成 this.a window.a // 1 let b = 1; window.b // undefined
- 對象本身
- ES5 頂層對象在不同環境中實現不同
- 瀏覽器,頂層對象是window,其他環境不支持
- 瀏覽器和Web Worker,self也指向頂層對象
- Node中,頂層對象是global,其他環境不支持
- this可以用于取頂層對象,但
- 全局環境中,this返回頂層對象,Node模塊和ES6模塊,this返回當前模塊
- 函數里面的,當函數不以對象方法運行,則this返回頂層對象,但是在嚴格模式下會為undefined
- 取頂層對象方法(勉強可用)
// 方法一 (typeof window !== 'undefined' ? window : (typeof process === 'object' && typeof require === 'function' && typeof global === 'object') ? global : this); // 方法二 var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } throw new Error('unable to locate global object'); };
- ES5 頂層對象在不同環境中實現不同