国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

ES6深入理解之“let”能替代”var“嗎?

2024-05-06 15:15:15
字體:
來源:轉載
供稿:網友

前言

我已經使用ES2015(ES6)的語法編寫JavaScript程序很久了,并且喜歡上它提供的新特性帶來的優雅和簡潔。我最習慣的就是不再使用var,而是let/const。我想當然的以為let僅僅是var的替代者,而事實上let還為我們提供了更加精細的作用域。

我大多數時候使用的變量都是用const來聲明,因為如果嘗試對使用const聲明的變量進行修改,將會報錯。這可以避免不小心將一個不該修改的常量值修改。但是,我們還是需要可以聲明可以被修改的變量,比如在循環里面的計數器,我們需要不斷地對改變了加1。可是為什么我們使用let而不是var呢?

最簡單的答案就是let提供塊作用域(block-scoping),這會比var提供的以函數為作用域有更加精細化的控制。為了便于理解,我來用一個經典的前端工程師面試的問題來描述兩者的區別。

問題: 在下面的例子中,請說出控制臺的打印結果。

var callbacks = [];(function() { for (var i = 0; i < 5; i++) { callbacks.push( function() { return i; } ); }})();console.log(callbacks.map( function(cb) { return cb(); } ));

我們將for循環執行五次,每次將一個函數push到callbacks數組中。最后callbacks數組里面的每一個函數的執行結果打印出來。

一個新手工程師經過深思熟慮可能會回答[0, 1 , 2, 3, 4], 然而卻掉入了JavaScript的”hoisting陷阱”。

只有當你理解了hoisting, 才能給出正確的答案[5, 5, 5, 5, 5]。

var callbacks = [];(function() { var i; for (i = 0; i < 5; i++) { callbacks.push( function() { return i; } ); }})();console.log(callbacks.map( function(cb) { return cb(); } ));

注意:上面的代碼,JavaScript將變量提升到函數定義的頂部,經過整個for循環,callbacks里面存儲的5個函數指向的同一個變量i的值已經是5。所以最終打印出來的值都為5。

在以前要通過各種奇淫技巧來解決這個問題,并成功返回[0, 1, 2, 3, 4], 現在我們有了let,就可以很簡單解決問題:

var callbacks = [];(function() { for (let i = 0; i < 5; i++) { callbacks.push( function() { return i; } ); }})();console.log(callbacks.map( function(cb) { return cb(); } ));

因為let擁有塊作用域,所以使用let聲明的變量i不會被提升到函數頂部,i的作用域在for循環, 就會每次循環有獨立的值。

那我們是不是應該不要使用var了呢?如果你想要一個變量擁有函數作用域,var還是很有用的。

讀者提到的兩個問題:

1、const聲明的變量不是完全不可更改。比如:

const myNotQuiteImmutableObject = { thisCanBeChanged: "not immutable"};myNotQuiteImmutableObject.thisCanBeChanged = "see I changed it.";

但是,使用const聲明可以阻止一些基本的更改,比如:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 青岛市| 旺苍县| 孝义市| 堆龙德庆县| 新龙县| 石台县| 赤壁市| 阿拉尔市| 台中市| 左云县| 日照市| 江川县| 依安县| 连城县| 绥棱县| 苏尼特左旗| 屏边| 开封县| 延寿县| 沙湾县| 昌吉市| 桂东县| 图木舒克市| 饶平县| 大理市| 东明县| 马关县| 运城市| 泰顺县| 新乡县| 常宁市| 原阳县| 辽源市| 庐江县| 牡丹江市| 吴堡县| 健康| 清流县| 南木林县| 台安县| 姜堰市|