谈谈 var, let, const. var 也是一种挑选

谈谈 var, let, const. var 也是一种挑选

汗青故事

在 ES6 之前, JavaScript 是一门被称为没有块级作用域的言语.

看看代码:

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

输出效果:

undefined


i=10

威望剖析: i=10 这是由于 i 被声明在当前函数的作用域内, var 不论你声明在函数的什么位置, 在函数实行之前, 剖析器会扫描当前函数作用域, 并将以 var 和 function 开首的语句的变量名添加到当前函数作用域内, 这意味着诸如 var func = function name() {} 如许的语句的右侧的函数的名字是不会被添加到当前作用域内的( 但是在函数内部能够接见 ), 在 ES6 中的 class 也有一样的表现. 此时 var 声明的变量还没有值( undefined ), 这也是第一个输出语句为何没报错而输出 undefined 的缘由; function 声明的函数名会指向一个函数对象( 也就是 __proto__ 属性指向 Function.prototype ).

这类征象关于习惯了块级作用域的顺序猿来说是灾害般的. 因而搞规范的那帮人弄了 let, const 如许的关键字出来. let 和 const 声明的变量不会在之前说的扫描阶段里被添加到当前作用域内, 而且会在当前大括号内的作用域块完毕的时刻被清算掉, 也就是说 ES6 有了块级作用域. 关于 const 还加了两条限定.

  • 假如 const 的变量是基础范例( null, undefined, string, number ), 那末变量的值不能变.

  • 假如 const 的变量是援用范例( object ), 那末其援用值不能转变.

看代码就知道了

(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 !

    原文作者:mrcode
    原文地址: https://segmentfault.com/a/1190000009740401
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞