ES6 了解之var、let和const声明

基本使用方式

  • let声明的变量只有在块级作用域内有效, 以外就会报not defined异常.

应用场景

1. 在for循环中使用let和var的声明

场景一:

for (let i = 0; i < 10; i++) {

}
console.log("外i:"+i);

场景一输出结果:

Uncaught ReferenceError: i is not defined
    at <anonymous>:6:20

场景二:

for (let i = 0; i < 10; i++) {
    console.log("内i:"+i);
}
console.log("外i:"+i);

场景二输出结果:

内i:0
内i:1
内i:2
内i:3
内i:4
内i:5
内i:6
内i:7
内i:8
内i:9
Uncaught ReferenceError: i is not defined
    at <anonymous>:6:20

场景三:
var a = [];
for (let i = 0; i < 10; i++) {
    a[i] = function () {
        console.log("内i:"+i);
    }
}
a[6]();
console.log("外i:"+i);

场景三输出结果:
内i:6
Uncaught ReferenceError: i is not defined
    at <anonymous>:8:19

场景四:
var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log("内i:"+i);
    }
}
a[6]();
console.log("外i:"+i);

场景四输出结果:
内i:10
外i:10

场景五:

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

场景五输出结果:

abc
abc
abc

场景六:

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

场景六输出结果:

abc

以上充分证明了:

  • 在循环体中, 如果用let声明同个变量名, 那么会有多个独立作用域的;
  • 在循环体中, 如果用var声明同一个变量, 后声明的变量会覆盖前面的, 只会存在一个作用域.

2. 未声明, 直接调用时

场景一:

console.log(f);
var f = 2;

场景一输出结果:

undefined (有此变量, 只不过其变量值默认为undefined, 此现象称为: var 变量提升)

场景二:

console.log(fd);
let fd = 2;

场景二输出结果:

Uncaught ReferenceError: fd is not defined (let 直接报未定义异常)

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  console.log("tmp1:"+tmp);
  let tmp;
  //console.log("tmp2:"+tmp);
}

⚠️注意点

  • var 声明变量, 该变量会绑到window
  • let 声明变量, 该变量不会绑到window上
posted @ 2017-11-30 14:23  chiuyer  阅读(157)  评论(0)    收藏  举报