ECMAScript6入门系列一

let 命令

{
  let a = 10;
  var b = 1;
}
a // ReferenceError: a is not defined.
b // 1

    【注】:let与var相似,用来声明变量.但是只在它所在的代码块内有效

    for (let i = 0; i < 10; i++) {}
    console.log(i); //Uncaught ReferenceError: i is not defined
console.log(foo); // 输出undefined
console.log(bar); // 报错ReferenceError

var foo = 2;
let bar = 2;

    【注】:let不存在变量提升的概念

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

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

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

        【注】:如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。

    块级作用域

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

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

    【注】:let不允许在同一作用域内重复声明一个变量

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

    【注】:let实际上给代码新增了块级作用域

// IIFE写法 匿名函数
(function () {
  var tmp = ...;
  ...
}());

// 块级作用域写法
{
  let tmp = ...;
  ...
}

    【注】:块级作用域使得匿名函数显得不是那么必要了

   ES5规范规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。(然后浏览器并不吃这一套,浏览器照样运行,除非在严格模式'use strict'下);而ES6引入了块级作用域的概念,则可以在块中声明函数,但是跟let一样,不可以在其他块中引用声明的函数,否则会报错(因为此规范影响大,具体还要看各浏览器对此的实现情况).

    例如:

// 情况一
if (true) {
  function f() {}
}

// 情况二
try {
  function f() {}
} catch(e) {
}

// ES6严格模式
'use strict';
if (true) {
  function f() {}
}
// 不报错

const命令

    1.作用:声明一个常量,

    2.特点:

  • 一旦声明,常量的值不能改变.
  • const一旦声明变量,就必须立即初始化,不能留到以后赋值。
  • const的作用域与let命令相同:只在声明所在的块级作用域内有效。
  • const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
  • const声明的常量,也与let一样不可重复声明。

//eg.1
const PI = 3.1415;
PI // 3.1415

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

//eg.2
const foo;
// SyntaxError: Missing initializer in const declaration

//eg.3
if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined

//eg.4
if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}

//eg.5
var message = "Hello!";
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;

//eg.6
const foo = {};
foo.prop = 123;

foo.prop
// 123

foo = {}; // TypeError: "foo" is read-only


//eg.7
const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave'];    // 报错

先到这~

posted @ 2016-07-06 15:46  VinceChueng  阅读(188)  评论(0编辑  收藏  举报