(聲明, 本文的所有代碼均在node的最新穩定版本v4.4.3中執行的, 如果在瀏覽器中執行請把JS的運行環境提升為ES6)
以前一直用var定義變量, 現在有了兩種新的定義變量的方式, 1: let, 2: const;本文大概概括下使用let和const定義變量有哪些好處;
let:
1:聲明提前
使用var聲明變量,存在聲明提前的問題, 輸出的tmp為"undefined":
{ var tmp = new Date(); let f = function (){ console.log(tmp); //undefined if (false){ //使用var聲明變量的聲明提前; var tmp = "hello world"; } } f(); }
如果我們把定義tmp的方式改為let呢? 那么tmp輸出的結果為當前的日期。
{ var tmp = new Date(); let f = () => { console.log(tmp); //輸出的結果為當前的日期 if (false){ //使用let的方式聲明, tmp的作用域只有在離他最近的一個{}括號中; let tmp = "hello world"; } } f(); }
2:塊狀作用域
let和const不但擁有塊狀作用域, 還也不存在聲明提前這個玩意兒, 以下代碼會報ReferenceError錯
{ let tmp = 123; { tmp = 234; let tmp = 456; } }
使用let聲明的元素作用域更加明確, 不會出現作用域混亂的情況, 可以減少bug的產生;
{ let foo = 0; { let foo = 1; foo = 2; } console.log(foo); }
以上這段代碼相當于是IIFE(立即執行函數表達式), 效果和以下的相同;
{ var foo = 0; (function(){ var foo = 1; foo = 2; }()); console.log(foo); }
再來猜猜這個的結果是什么,( var 形式聲明的變量會提升到{}外面去哦 , {}形式的塊狀作用域相當于是if(true){//code}的寫法):

{ var foo = 0; { var foo = 1; foo = 2; } console.log(foo); }
3:重復聲明
使用let聲明的變量不能重復聲明,否則會出現一下錯誤:
SyntaxError: Identifier 'a' has already been declared
注意: 在全局下用let聲明變量和用var聲明變量還是有區別的:
<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"/> </head> <body> <script> "use strict"; let foo = 1; console.log(window.foo); //輸出 undefined var bar = 1; console.log(window.bar); //輸出1 </script> </body> </html>
const:
使用const定義的常量, 而且定義一次以后不能再進行更改, 否者會報錯;
使用const定義的常量, 擁有let一樣的特性(無聲明提前, 有塊狀作用域, 重復聲明);
但是要注意, 如果給常量定義的是對象,只要該對象指向在內存中的地址不發生改變, 數據可以隨便改的(這涉及到計算機的傳值和傳址);
對象:
{ const foo = {}; foo.bar = 1111; console.log(foo.bar); }
數組:
{ const foo = []; foo.push(1); foo.push(2); console.log(JSON.stringify(foo)); }
這些新語法讓JS更加規范, 也更加適合大項目, 我仿佛猜到以后要用private和public聲明變量了....( ╯□╰ )
參考:
阮一峰:http://es6.ruanyifeng.com/#docs/let
https://github.com/DrkSephy/es6-cheatsheet#var-versus-let--const
作者: NONO
出處:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830
文章列表