ECMAScript 6入门读书笔记一

let与const

let

也是用来声明变量,可是不一样于var,我的理解是它是用来修复var的一些神奇效果,似的变量更加规范,简单来讲let定义的变量就是私有变量,有如下几点做用安全

  • let声明的变量只在它所在的代码块中生效(即它的块级做用域中生效)
if (true) {
    let i;
    console.log(i);
}
//console.log(i);  ReferenceError: i is not defined
  • 对于for循环的块级做用域,当let声明循环体i时,有两个特色
  • let声明的i外部不能被访问闭包

    for (let i = 0; i < 4; i ++) {
            console.log(i);
        }
    console.log(i);  //i is not defined

    之因此里面能访问i,由于for循环子做用域能访问外部做用code

  • for循环当在子做用域,声明let i时与循环体i是独立的对象

    for (let i = 0; i < 4; i ++) {
            let i = 6;
            console.log(i);
        }

    为何能,简单说就是i私有了内存

  • 每次循环let都是从新申明的,正由于这样,就能解决for循环时闭包带来的问题作用域

    for (let i = 0; i < 4; i ++) {
            setTimeout(function () {console.log(i)}, 100)
        }
    //0 1 2 3
    for (var i = 0; i < 4; i ++) {
            setTimeout(function () {console.log(i)}, 100)
        }
    //4 4 4 4
  • 不存在变量提高,io

    //console.log(i);
    //console.log(typeof i);
    let i;

    都是会报错的,i is not defined。
    对于let声明的变量,typeof 再也不是安全形式了,而且该变量必须在声明后才能使用,在它以前使用那就是暂时的死区console

    function f(x=y,y=2) {};
    f(); //y is not defined
    let x = x; //x is not defined
  • 同一做用域中也不能重复定义for循环

    let i;
    let i;  //报错
    function f(n) {
        let n
    }
    f();  //报错

    不一样做用域能够重复且各自独立function

    function f(n) {
       {let n}
    }
  • let声明的变量不属于window

    let i = 1;
    console.log(window.i); //undefined

const做用是用来声明常量

做用和let同样,但多两点

  • 一旦声明必须初始化,也就是必需赋值,不然报错;

    const P = 1;
  • 一旦赋值不能被改变,其本质是不能改变变量的内存地址
    变量是原始类型的数据,其自己就是不可变的,再加上不能从新赋值,改变地址

    const P = 1;
    P = 2;   //报错

    变量是对象类型的,其自己是可变的,因此也就能改变,要注意的是其地址并不改变

    const P = {a : 1} ;
    P.a =2;
    console.log(P);  //{a : 2}

    想要其内容也不变,能够冻结它

    const P = {a : 1} ;
    Object.freeze(P);
    P.a =2;
    console.log(P);
相关文章
相关标签/搜索