ES6中let

ES6里增加了一个let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。

//--- 词法作用域
{
    let a = 10;
    var b = 10;
}
console.log(a);  //报错
console.log(b); //10

let声明的变量在作用域外是访问不到的

块级作用域 if

function getVal(bool){
  if(bool){
    let val = 'red';
    //访问到val
    return val;
  }else{
    //访问不到val
  }
  //访问不到val
}

块级作用域 for

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 a = [];
for (let i = 0; i < 10; i++) {
    a[i] = (function(i) {
        return function(){
          console.log(i);
       }
    })(i);
}
a[6](); //6

块级作用域,存的不是引用,直接是i的值
** 变量提升(先使用后声明)**

function do_something() {
    console.log(foo);
    var foo = 2;
}

变量val先使用后声明,输出undefined,也不报错。

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

let定义变量不能重复声明

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

let的声明的变量不会挂载到全局属性

var a = 1;
window.a; //1
let b = 1;
window.b; //undefined

你可能感兴趣的:(ES6中let)