白话es6系列二:你真的会声明变量吗

ES6新增了二个声明变量的关键字,let和const,再加上ES6之前的var,如许声明变量就有三个关键字了,大有三国鼎立之势。那究竟用哪一个来声明变量呢?

var

起首,得说说var的特别行动,变量提拔,来看一个例子:

var condition = false

if (condition) {
  var value = 'red'
  console.log(value)
} else {
  // value 在这里能够接见,值为undefined
  console.log(value)
}

在上面代码中,纵然condition为false,变量value也是存在的,相当于以下定义:

var condition = false
var value

if (condition) {
  value = 'red'
  console.log(value)
} else {
  // value 在这里能够接见,值为undefined
  console.log(value)
}

就是说,运用var关键字声明的变量,不管其现实声明位置在那边,都会被视为声明于地点函数的顶部(假如声明不在函数内,则视为在全局作用域的顶部),这就是变量提拔。

对这类特别行动,假如你不理解,就很能够致使bug。我们来看一个轮回的例子:

for (var i = 0; i < 6; i++) {
  console.log(i)
}

// i 在这里照旧能够接见
console.log(i)  // 6

for轮回完了,已不再须要变量i,然则它照旧能够被接见。

所以,ES6引入了块级作用域,让变量的生命周期越发可控,因而,let涌现了。

块级声明-let

我们来看看用let声明的代码:

var condition = false

if (condition) {
  let value = 'red'
  console.log(value)
} else {
  // value 在这里不能够接见,会报错
  console.log(value)
}

由于变量value声明运用的是let,所以就没有被提拔到函数定义的顶部,变量value在if代码块外部是无法接见的。当condition的值为false 时,该变量不会被声明并初始化。
假如上面的谁人for轮回顶用let声明变量i,那末轮回完了,变量i也就随时烧毁,不能再被接见。

常量声明-const

运用const声明的变量会被认为是常量(constant),意味着它们的值在被设置完成后就不能再被转变,常量声明与let声明一样,都是块级声明。
来看个小例子:

const num = 12
num = 13 // 报错

const obj = { name: 'moddx', age: 28 };
obj.age = 26 // 一般

上面用const声清楚明了一个变量num,当从新给其赋值时会报错,而变量obj初始化以后,再将其age属性转变,不会报错,由于对象是一个援用范例,其指向的内存中的地点是没有被转变的,除非将其从新赋值给一个新对象,就会报错,以下:

const obj = { name: 'moddx', age: 28 };
obj = { name: 'foo' } // 报错

总结

说了这么多,那究竟时刻用什么关键字来声明呢?就没有一个规范或许约定俗成的习气吗?
现在,被普遍承认的变量声明体式格局是:默许情况下应该运用const,当你肯定声明的变量须要转变时,用let声明。其根据是大部分变量在初始化以后都不应该被修正,由于预期外的修改是bug的泉源之一。(那var呢?好吧,基础被抛弃了)

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