ES6(一)const与let

一  let 命令

(1) let声明的变量在代码块{}中有效

{
  let a = 10;
  var b = 1;
}

output:
a //ReferenceError: a is not defined
b //1
//打印循环计数
//var 声明的变量,通过闭包实现
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = (function (i) {
    console.log(i);
  })(i);
}
a[6](); // 6

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

(2) let不存在变量提升

if (1) {
  typeof x;  // ReferenceError
  let x;
}

(3) 只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var tmp = 123;

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

(4) 在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

(5) 隐蔽的死区分析(函数参数=左边为函数内部声明,右边为函数外部声明)

function bar(x=y, y=2) {
  return [x, y];
}

bar(); // 报错,y在声明前使用。
函数作为参数:
let foo = 'outer';

function bar(func = x => foo) {
  let foo = 'inner';
  console.log(func()); // outer
}

bar();
以上等同于:
let foo = 'outer';
let f = x => foo;

function bar(func = f) {
  let foo = 'inner';
  console.log(func()); // outer
}

bar(); 

(6) 不允许重复声明(let与let,let与var都不能同时声明一个变量)

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

// 报错
{
  let a = 10;
  let a = 1;
}
在函数内部重新声明参数是错误的:
function func(arg) {
  let arg; // 报错
}
但是增加一层块状作用域就正确了:
function func(arg) {
  {
    let arg; // 不报错
  }
}

二   const 命令

(1) const 也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变

const PI = 3.1415;
PI // 3.1415

PI = 3;
PI // 3.1415

(2) const 命令只是指向变量所在的地址,引用类型可以改变属性,只要不重新赋值即可

const foo = {};
foo.prop = 123;

foo.prop
// 123
注:想将对象冻结,应该使用 Object.freeze 方法
const foo = Object.freeze({});
foo.prop = 123; // 不起作用
foo //{}

三 全局对象

(1) 在浏览器环境指的是 window 对象,在 Node.js 指的是 global 对象,为了兼容性,可以使用this.

(2) ES6 规定,var 命令和 function 命令声明的全局变量,属于全局对象的属性;let 命令、const 命令、class 命令声明的全局变量,不属于全局对象的属性。

var a = 1;
// 如果在node环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined

你可能感兴趣的:(es6,es6,let,const)