談談 var, let, const. var 也是一種選擇

談談 var, let, const. var 也是一種選擇

歷史故事

在 ES6 以前, JavaScript 是一門被稱爲沒有塊級做用域的語言. javascript

看看代碼:java

(function(){
    'use strict';
    console.log(i)
    for (var i = 0; i < 10; ++i) { console.log(i) }
    console.log('i=' + i)
})()

輸出結果:git

undefined
...
...
i=10github

權威解析: i=10 這是由於 i 被聲明在當前函數的做用域內, var 無論你聲明在函數的什麼位置, 在函數執行以前, 解析器會掃描當前函數做用域, 並將以 var 和 function 開頭的語句的變量名添加到當前函數做用域內, 這意味着諸如 var func = function name() {} 這樣的語句的右邊的函數的名字是不會被添加到當前做用域內的( 可是在函數內部能夠訪問 ), 在 ES6 中的 class 也有一樣的表現. 此時 var 聲明的變量尚未值( undefined ), 這也是第一個輸出語句爲何沒報錯而輸出 undefined 的緣由; function 聲明的函數名會指向一個函數對象( 也就是 __proto__ 屬性指向 Function.prototype ). async

這種現象對於習慣了塊級做用域的程序猿來講是災難般的. 因而搞標準的那幫人弄了 let, const 這樣的關鍵字出來. let 和 const 聲明的變量不會在以前說的掃描階段裏被添加到當前做用域內, 而且會在當前大括號內的做用域塊結束的時候被清理掉, 也就是說 ES6 有了塊級做用域. 對於 const 還加了兩條限制.函數

  • 若是 const 的變量是基本類型( null, undefined, string, number ), 那麼變量的值不能變.工具

  • 若是 const 的變量是引用類型( object ), 那麼其引用值不能改變.prototype

看代碼就知道了code

(function(){
    'use strict';
    
    // 若是執行下面這行代碼, 會報引用錯誤
    // console.log(i)  // Reference Error
    
    // 若是執行下面這行代碼, 會報引用錯誤
    // 由於 i 在 for 循環結束後就被銷燬了
    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
})()

我該怎麼選擇?

若是你稍微接觸過 ES6, 別人會告訴你 絕對不要用 var, 若是變量在未來不會改變就用 const, 不然就用 let.對象

這句話我是贊同的, 可是在我寫代碼的時候遇到某些狀況不得不用 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 變量若是用 letconst 聲明的話, finally 內就沒辦法釋放鏈接了. 有人說爲何不直接在 try 內寫個 if 判斷? 我的以爲在 finally 裏看起來更優雅一些.

因此說, 有時候做用域鏈反卻是 javascript 這門語言的優點, 爲此, 我不得不說, javascript 是世界上最好的語言!

最後想說的

大家有沒有遇到過 github issues 上寫文章的人... 我反正是看到了不少在 Github 上的 issues 寫技術博客的人. 以前都喜歡用 Github 的 Subscribe 功能來訂閱, 或者直接 Watching ... 這兩天突發奇想, 能不能把 issues 轉換成 RSS 呢? 因此就擼了一個小工具, github-issues-rss, 求關注, 求 star !

相關文章
相關標籤/搜索