美文网首页
let与const

let与const

作者: 秋枫残红 | 来源:发表于2017-09-04 21:20 被阅读0次

let用法

ES6新增了let命令,用法与var类似,主要用于声明变量,且逐渐代替var,与var的区别为,其声明的变量只在自己所在的块级作用域内有效。
eg:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

由于var不支持块级作用域所以在循环时时声明循环变量,与在循环外部声明并无区别。而let关键字支持块级作用域每次调用函数时都可以在块内找到变量i,并进行输出。
  值得注意的是一个for循环并不一个块级作用域,而是俩个,循环体作为子作用域,而循环头部属于父级作用域。
eg:

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}
// abc
// abc
// abc

补充一点,在ES5中只有全局作用域和函数作用域,除此之外,几乎所有带{}的作用域都可以看做块级作用域

变量提升

我们都知道在使用var声明变量时,可以先使用,而后声明,此时程序也不会报错,只是将变量当做undfined使用,这样会给编程带来不可预料的问题,也不是一种良好的编程习惯。在ES6中使用let关键字声明变量,需严格遵守先声明,后使用的原则,否则抛出错误。

暂时性死区

由上文我们已经知道,let声明的变量只在自己的块级作用域内起作用,那么若是想使用在外部声明的同名变量,又会怎么样呢?

var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
  ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
  总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

不允许重复声明

不同于var,let不允许重复申明

// 报错
function () {
  let a = 10;
  var a = 1;
}

// 报错
function () {
  let a = 10;
  let a = 1;
}

因此,不能在函数内部重新声明参数。

function func(arg) {
  let arg; // 报错
}
function func(arg) {
  {
    let arg; // 不报错
  }
}

const命令

const命令用来声明常量,即所声明的值不可改变,改变则抛出错误。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

  const命令与let相同的是其也只在它所属的块级作用域内起作用,也存在暂时性死区。
  然而事无绝对,const所声明的值只是设置其变量所指向的指针不可改变,而指针所指向具体物理地址的值还是可以改变的,也就是说,对于number类型,String类型及Boolean类型不可改变,而对于Object及Array类型不可以改变对象指针或数组指针指向的位置,但其内的元素却是可以改变的。

全局变量

  在ES5中,声明的全局变量直接与顶层对象window挂钩,为window对象的属性(在node中为global),这种做法会为程序带来一些不可预知的错误,因此在ES6中对其作出了优化,但也并未完全摈弃这种做法,只是用var声明的全局变量依然为顶层对象window的属性,而使用const与let所声明的则与window对象没有关系。

相关文章

  • ES6语法

    const 与 let变量

  • let和const

    let/const(常用) let和var 区别 let,const用于声明变量,用来替代老语法的var关键字,与...

  • ES6_var、let与const

    var,let 与 const var 申明变量。 let 申明变量,更完美的 var。 const 申明常量(物...

  • ES6

    let , const const 与 let 的区别:1. 声明时必须赋值 2.只能赋值一次 let 存在暂时...

  • 我读ES6--变量声明

    1.关于var和let、const let、const与var一样,都是用来声明变量,但都有其特殊的用途。let ...

  • ES6

    let const let const 没有变量提升let 块级作用域const 常量 模板语言, restfu

  • ES6-let & const

    一. let与var let 是块级作用域;var 是函数级作用域。 二. let 与 const let与con...

  • JavaScript 变量宣告 var let const

    宣告变量有三种方式: var let const var 与 let、const 的主要差异在于作用域。 作用域(...

  • Let 与 Const

    有幸在网上找到了 《Exploring ES6》一书的电子版,赶紧下载下来拜读一番。此书为英文版本,暂无中文翻译版...

  • let与const

    let用法 ES6新增了let命令,用法与var类似,主要用于声明变量,且逐渐代替var,与var的区别为,其声明...

网友评论

      本文标题:let与const

      本文链接:https://www.haomeiwen.com/subject/nuxyjxtx.html