晴明的博客园 GitHub      CodePen      CodeWars     

[ES6] let 、 const

#

let
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];

声明了一个块级域的本地变量,并且可以同时初始化该变量。

let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。

 

在用到内部函数的时候,let 能够让代码更简洁

var list = document.getElementById("list");

for (var i = 1; i <= 5; i++) {
  var item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  let j = i;
  item.onclick = function (ev) {
    console.log("Item " + j + " is clicked.");
  };
  list.appendChild(item);
}

 

与var不同,let是块级

function varTest() {
  var x = 31;
  if (true) {
    var x = 71;  // same variable!
    console.log(x);  // 71
  }
  console.log(x);  // 71
}

function letTest() {
  let x = 31;
  if (true) {
    let x = 71;  // different variable
    console.log(x);  // 71
  }
  console.log(x);  // 31
}

#

//关键点还是块级
if(a<3) {
    let b = 1;
    console.log(b);
}
if(a<3) {
    let b = 2;
    console.log(b);
}
if(a<3) {
    let b = 3;
    console.log(b);
}

 

#

var a = 5;
var b = 10;

if (a === 5) {
  let a = 4; // The scope is inside the if-block
  var b = 1; // The scope is inside the function

  console.log(a);  // 4
  console.log(b);  // 1
} 

console.log(a); // 5
console.log(b); // 1

全局

var x = 'global';
let y = 'global';
console.log(this.x);//global
console.log(this.y);//global

let 在循环中

for (let i = 0; i<10; i++) {
  console.log(i); // 0, 1, 2, 3, 4 ... 9
}

console.log(i); // i is not defined

let重复定义一个变量将引起 TypeError.

if (x) {
  let foo;
  let foo; // TypeError thrown.
}

#

switch (x) {
  case 0:
    let foo;
    break;
    
  case 1:
    let foo; // TypeError for redeclaration.
    break;
}

暂存死区

function do_something() {
  console.log(foo); // ReferenceError
  let foo = 2;
}

在方法内对同参数名变量声明会报错

 ```

    function xx(a) {
        let a = 2;
        console.log(a)//error
    }
    xx(3);
    function yy(a) {
        var a = 2;
        console.log(a)//2
    }
    yy(3);

```

 

变量提升
```
    console.log(o);//error
    console.log(k);//undefined
    let o = 33;
    var k = 44;

```

const
声明创建一个只读的常量。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。

这个声明创建了一个常量,可以在全局作用域或者函数内声明常量,常量需要被初始化。
在定义常量的同时必须初始化(鉴于常量的值在初始化后就不能改变)。

常量拥有块作用域,和使用let 定义的变量十分相似。常量的值不能通过再赋值改变,也不能再次声明。

一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。

常量在声明的时候可以使用大小写,但通常情况下会使用全部大写英文。

 

#

const aa = 2;
function cc(){
//console.log(aa);
 const aa = 3;
 console.log(aa);//3
}
cc();
console.log(aa);//2

 

#

// 定义常量MY_FAV并赋值7
const MY_FAV = 7;

// 在 Firefox 和 Chrome 这会失败但不会报错(在 Safari这个赋值会成功)
MY_FAV = 20;

// 输出 7
console.log("my favorite number is: " + MY_FAV);

// 尝试重新声明会报错 
const MY_FAV = 20;

//  MY_FAV 保留给上面的常量,这个操作会失败
var MY_FAV = 20; 

// MY_FAV 依旧为7
console.log("my favorite number is " + MY_FAV);

#

// 下面是一个语法错误
const A = 1; A = 2;

// 常量要求一个初始值
const FOO; // SyntaxError: missing = in const declaration

#

// 常量可以定义成对象
const MY_OBJECT = {"key": "value"};

// 重写对象和上面一样会失败
MY_OBJECT = {"OTHER_KEY": "value"};

// 对象属性并不在保护的范围内,下面这个声明会成功执行
MY_OBJECT.key = "otherValue";

 

#

 

posted @ 2016-05-11 15:37  晴明桑  阅读(191)  评论(0编辑  收藏  举报