阮一峰的ES6---let和const命令
一,let和const命令
let命令用來宣告變數,他的作用類似於var,但是所宣告的變數只在let命令所在的程式碼塊內部有效,不像var那樣,會發生變數提升現象;
for()迴圈的計數器,適合使用let命令;
for(let i =0;i
暫時性的死區
var name="MGT360124";
if(true){
name = "YSS360124";//ReferenceError
let name;
}
全域性變數name,但是塊級作用域內有let又宣告瞭一個區域性變數name;
導致後者繫結這個塊級作用域,所以在let宣告變數前,對name賦值會報錯;所以在程式碼塊內,使用let命令宣告變數之前,該變數都是不可用的,在語法上稱為"暫時性死區"(TDZ);
‘’暫時性的死區‘’也意味著typeof不再是一個百分之百安全的操作;
{
typeof name;//ReferenceError
let name;
}
ES5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。
第一種場景,內層變數可能會覆蓋外層變數。
var name = "MGT360124";
function getName(){
console.log(name);
var name="YSS360124"
}
getName();//undefined
第二種場景,用來計數的迴圈變數洩露為全域性變數。
for(var i=0;i
ES6的塊級作用域
{
let name = "MGT360124";
}
name;
ES6 允許塊級作用域的任意巢狀。
{{{{
{let insane = 'Hello World'}
console.log(insane); // 報錯
}}}};
do表示式
塊級作用域是一個語句,將多個操作封裝在一起,沒有返回值。
使用do表示式,使得塊級作用域可以變為表示式,也就是說可以返回值;
let x = do{
let t = f();
t * t + 1;
}//變數x會得到整個塊級作用域的返回值
const 命令
const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。const foo; // SyntaxError: Missing initializer in const declaration
const的作用域與let命令相同:只在宣告所在的塊級作用域內有效。const命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。
const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址不得改動,對於簡單資料型別(數值,字串,布林值),值就儲存在變數指向的那個記憶體地址,因此等同於常量,但是對於複合型別的資料(物件和陣列)變數指向的記憶體地址,儲存的只是一個指標,const只能保證這個指標第固定的,至於他指向的資料結構是不是可變的,就完全不能控制了;
const foo = {};
foo.prop=123;//為foo新增一個屬性
foo.prop;//123
foo={}//將foo指向另一個物件,就會報錯
常量foo儲存的是一個地址,這個地址指向一個物件,不可變的只是這個地址,
即不能把foo指向另一個地址,但是物件本身是可變的,所以依然可以為其新增新屬性;
const a = [];
a.push("hello");
a.length = 0;
a=["world"];//報錯
頂層物件的屬性
頂層物件,在瀏覽器環境指的是window物件,在node指的是global物件;
頂層物件的屬性和全域性變數掛鉤,被認為是js中最大的失敗;ES6為了改變這一點,並保持相容性,var 命令和function命令宣告的全域性變數,依舊是頂層物件,另一方面規定:let命令和const命令,class命令宣告的全域性變數不再屬於頂層物件的屬性,也就是說:從ES6開始,全域性變數將逐漸與鼎城物件的屬性脫鉤;
var name="MGT360124";
window.name;//MGT360124
let age=18;
window.age;//undefined
ES5的頂層物件,本身也是個問題,因為他在各種實現裡面是不統一的;
1,瀏覽器裡面,頂層物件是window,但是node和web workers(Web Workers 是 HTML5 提供的一個javascript多執行緒解決方案)沒有window
2,瀏覽器和web Workers裡面,self也是指向頂層物件,但是node沒有self
3,node裡面頂層物件時global,但是其他環境都不支援;
同一段程式碼為了能夠在各種環境,都能取得到頂層物件,一般用this變數,但是也有侷限性。
1, 全域性環境中,this會返回頂層物件。但是node模組和ES6模組中this
返回的是當前模組;
2,函式里面的this,如果函式不是作為物件的方法執行,而是單純作為函式執行,那麼this會指向頂層物件,但是在嚴格模式下,this會返回undefined;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/132/viewspace-2799500/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阮一峰快速排序排序
- 阮一峰部落格精選
- 值得學習的技術人——阮一峰
- [翻譯]阮一峰webpack教程(Demo集合)Web
- 阮一峰每週分享第 2 期
- 阮一峰的ES6---Class的基本語法
- 阮一峰關於js同步非同步的解釋JS非同步
- React入門例項參考阮一峰部落格React
- NodeJs或者命令列爬取網路教程並生成PDF檔案,以阮一峰JavaScript教程和ES6教程為例NodeJS命令列JavaScript
- ES6 let和const命令
- ES6let命令和塊級作用域和const命令
- JavaScript const 命令JavaScript
- 阮一峰:什麼?你居然還不知道字串匹配演算法!字串匹配演算法
- let與const命令
- 每日一記 3分鐘從編譯後的程式碼裡學 let 和 const 命令編譯
- var,let和const深入解析(一)
- 頂層const和底層const
- C語言 關鍵字const的作用 const int* 和int *const 的區別C語言
- let和const
- const和define
- 搞懂頂層const和底層const
- const、define 和 static 的區別
- var和let/const的區別
- var、let和const的區別
- var、let和const的知識點
- ES6學習筆記(一)————————————–let和const筆記
- ES6學習筆記一(let和const)筆記
- const * and * const
- const 變數和指標變數指標
- ES6 let和const
- 每天學習一點ES6(二)let 和 const
- ES6中let和var和const的區別
- ES6中let 和 const 的新特性
- PHP 定義常量 define 和 const的區別PHP
- Golang 學習——常量 const 和 iotaGolang
- ES6之const和let
- const char*, char const*, char*const 有何區別?
- 前端學習筆記 - var、let和const的用法前端筆記