摘要:談?wù)勔彩且环N選擇歷史故事在之前是一門(mén)被稱(chēng)為沒(méi)有塊級(jí)作用域的語(yǔ)言看看代碼輸出結(jié)果權(quán)威解析這是因?yàn)楸宦暶髟诋?dāng)前函數(shù)的作用域內(nèi)不管你聲明在函數(shù)的什么位置在函數(shù)執(zhí)行之前解析器會(huì)掃描當(dāng)前函數(shù)作用域并將以和開(kāi)頭的語(yǔ)句的變量名添加到當(dāng)前函數(shù)作用域內(nèi)這意味
談?wù)?var, let, const. var 也是一種選擇 歷史故事
在 ES6 之前, JavaScript 是一門(mén)被稱(chēng)為沒(méi)有塊級(jí)作用域的語(yǔ)言.
看看代碼:
(function(){ "use strict"; console.log(i) for (var i = 0; i < 10; ++i) { console.log(i) } console.log("i=" + i) })()
輸出結(jié)果:
undefined
...
...
i=10
權(quán)威解析: i=10 這是因?yàn)?i 被聲明在當(dāng)前函數(shù)的作用域內(nèi), var 不管你聲明在函數(shù)的什么位置, 在函數(shù)執(zhí)行之前, 解析器會(huì)掃描當(dāng)前函數(shù)作用域, 并將以 var 和 function 開(kāi)頭的語(yǔ)句的變量名添加到當(dāng)前函數(shù)作用域內(nèi), 這意味著諸如 var func = function name() {} 這樣的語(yǔ)句的右邊的函數(shù)的名字是不會(huì)被添加到當(dāng)前作用域內(nèi)的( 但是在函數(shù)內(nèi)部可以訪(fǎng)問(wèn) ), 在 ES6 中的 class 也有同樣的表現(xiàn). 此時(shí) var 聲明的變量還沒(méi)有值( undefined ), 這也是第一個(gè)輸出語(yǔ)句為什么沒(méi)報(bào)錯(cuò)而輸出 undefined 的原因; function 聲明的函數(shù)名會(huì)指向一個(gè)函數(shù)對(duì)象( 也就是 __proto__ 屬性指向 Function.prototype ).
這種現(xiàn)象對(duì)于習(xí)慣了塊級(jí)作用域的程序猿來(lái)說(shuō)是災(zāi)難般的. 于是搞標(biāo)準(zhǔn)的那幫人弄了 let, const 這樣的關(guān)鍵字出來(lái). let 和 const 聲明的變量不會(huì)在之前說(shuō)的掃描階段里被添加到當(dāng)前作用域內(nèi), 并且會(huì)在當(dāng)前大括號(hào)內(nèi)的作用域塊結(jié)束的時(shí)候被清理掉, 也就是說(shuō) ES6 有了塊級(jí)作用域. 對(duì)于 const 還加了兩條限制.
如果 const 的變量是基本類(lèi)型( null, undefined, string, number ), 那么變量的值不能變.
如果 const 的變量是引用類(lèi)型( object ), 那么其引用值不能改變.
看代碼就知道了
(function(){ "use strict"; // 如果執(zhí)行下面這行代碼, 會(huì)報(bào)引用錯(cuò)誤 // console.log(i) // Reference Error // 如果執(zhí)行下面這行代碼, 會(huì)報(bào)引用錯(cuò)誤 // 因?yàn)?i 在 for 循環(huán)結(jié)束后就被銷(xiāo)毀了 setTimeout(() => console.log(i), 0) for (let i = 0; i < 10; ++i) { console.log(i) } const foo = 10 const bar = {} foo = 11 // TypeError bar.type = "const" // OK })()我該怎么選擇?
如果你稍微接觸過(guò) ES6, 別人會(huì)告訴你 絕對(duì)不要用 var, 如果變量在將來(lái)不會(huì)改變就用 const, 否則就用 let.
這句話(huà)我是贊同的, 但是在我寫(xiě)代碼的時(shí)候遇到某些情況不得不用 var, 看代碼:
async function clearExpiredRss() { try { var connection = await pool.getConnection() connection.query(`DELETE FROM ${TABLE_NAME} WHERE date+3600*1000 < ${Date.now()}`) } catch (e) { logger.error(e) } finally { connection && connection.release() } }
connection 變量如果用 let 或 const 聲明的話(huà), finally 內(nèi)就沒(méi)辦法釋放連接了. 有人說(shuō)為什么不直接在 try 內(nèi)寫(xiě)個(gè) if 判斷? 個(gè)人覺(jué)得在 finally 里看起來(lái)更優(yōu)雅一些.
所以說(shuō), 有時(shí)候作用域鏈反倒是 javascript 這門(mén)語(yǔ)言的優(yōu)勢(shì), 為此, 我不得不說(shuō), javascript 是世界上最好的語(yǔ)言!
最后想說(shuō)的你們有沒(méi)有遇到過(guò) github issues 上寫(xiě)文章的人... 我反正是看到了很多在 Github 上的 issues 寫(xiě)技術(shù)博客的人. 之前都喜歡用 Github 的 Subscribe 功能來(lái)訂閱, 或者直接 Watching ... 這兩天突發(fā)奇想, 能不能把 issues 轉(zhuǎn)換成 RSS 呢? 所以就擼了一個(gè)小工具, github-issues-rss, 求關(guān)注, 求 star !
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87054.html
摘要:另外這樣的異常捕獲不能捕獲的異常錯(cuò)誤信息,這點(diǎn)需要注意。最終大致的流程圖如下結(jié)語(yǔ)前端異常捕獲與上報(bào)是前端異常監(jiān)控的前提,了解并做好了異常數(shù)據(jù)的收集和分析才能實(shí)現(xiàn)一個(gè)完善的錯(cuò)誤響應(yīng)和處理機(jī)制,最終達(dá)成數(shù)據(jù)可視化。 關(guān)于 微信公眾號(hào):前端呼啦圈(Love-FED) 我的博客:勞卜的博客 知乎專(zhuān)欄:前端呼啦圈 前言 Hello,大家好,又與大家見(jiàn)面了,這次給大家分享下前端異常監(jiān)控中需...
摘要:它們有個(gè)統(tǒng)一的名字預(yù)處理器。面對(duì)以上問(wèn)題,預(yù)處理器給出了非??尚械慕鉀Q方案變量就像其他編程語(yǔ)言一樣,免于多處修改。回到話(huà)題中,之所以會(huì)出現(xiàn)向預(yù)處理器這樣子的解決方案,歸根結(jié)底還是標(biāo)準(zhǔn)發(fā)展的滯后性導(dǎo)致的。 前言 現(xiàn)在的前端,javascript的發(fā)展有目共睹,框架林立。同時(shí),html也是齊頭并進(jìn),推出了HTML5標(biāo)準(zhǔn),并且得到了普及。這樣的發(fā)展卻唯獨(dú)少了一個(gè)角色? CSS,就是這個(gè)看似不...
摘要:它們有個(gè)統(tǒng)一的名字預(yù)處理器。面對(duì)以上問(wèn)題,預(yù)處理器給出了非??尚械慕鉀Q方案變量就像其他編程語(yǔ)言一樣,免于多處修改?;氐皆?huà)題中,之所以會(huì)出現(xiàn)向預(yù)處理器這樣子的解決方案,歸根結(jié)底還是標(biāo)準(zhǔn)發(fā)展的滯后性導(dǎo)致的。 前言 現(xiàn)在的前端,javascript的發(fā)展有目共睹,框架林立。同時(shí),html也是齊頭并進(jìn),推出了HTML5標(biāo)準(zhǔn),并且得到了普及。這樣的發(fā)展卻唯獨(dú)少了一個(gè)角色? CSS,就是這個(gè)看似不...
摘要:那么,它到底是如何工作的呢讓我們從一種更簡(jiǎn)單的實(shí)現(xiàn)開(kāi)始實(shí)際上這種實(shí)現(xiàn)代碼更短,并且更易讀是函數(shù)原型中的一個(gè)函數(shù),它調(diào)用函數(shù),使用第一個(gè)參數(shù)作為參數(shù),并傳遞剩余參數(shù)作為被調(diào)用函數(shù)的參數(shù)。 原文:The Most Clever Line of JavaScript 作者:Seva Zaikov 原文 最近 一個(gè)朋友 發(fā)給我一段非常有趣的 JavaScript 代碼,是他在某個(gè) 開(kāi)源庫(kù)中...
嚴(yán)格模式 首先來(lái)了解一下嚴(yán)格模式是什么?嚴(yán)格模式是JavaScript中的一種限制性更強(qiáng)的變種方式,不是一個(gè)子集:它在語(yǔ)義上與正常代碼有明顯的差異,不支持嚴(yán)格模式的瀏覽器與支持嚴(yán)格模式的瀏覽器行為上也不一樣,所以不要在未經(jīng)嚴(yán)格模式特性測(cè)試情況下使用嚴(yán)格模式,嚴(yán)格模式可以與非嚴(yán)格模式共存,所以腳本可以逐漸的選擇性加入嚴(yán)格模式 嚴(yán)格模式的目的 首先,嚴(yán)格模式會(huì)將JavaScript陷阱直接變成明顯的錯(cuò)...
閱讀 6940·2021-09-22 15:08
閱讀 1935·2021-08-24 10:03
閱讀 2450·2021-08-20 09:36
閱讀 1332·2020-12-03 17:22
閱讀 2483·2019-08-30 15:55
閱讀 914·2019-08-29 16:13
閱讀 3064·2019-08-29 12:41
閱讀 3261·2019-08-26 12:12