es6-声明变量

2017-07-28  本文已影响87人  heheheyuanqing

let命令

{
    var a = 1;
    let b  = 2; 
}
a;      //1
b;      //进行报错

通过let声明的变量b只作用在大括号内,在括号外调用变量b时则会进行报错;
  通过var声明的变量在全局中都有效

{
    console.log(foo);  //输出undefined
    var foo = 1;

    console.log(goo);  //抛出错误
    let goo = 2;
}

通过var声明的变量可以在声明前使用
  通过let声明的变量不能在声明前使用

在编写代码的过程中尽量先声明再使用

暂时性死区

在let声明变量之前的代码称为变量goo的暂时性死区,结束的位置即let声明的代码区;
其本质是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

{
    function foo(arg){
        var a = 1;
        let a  = 2;  //报错
        let arg = "hello world !";  //报错
        
        {
        let arg = "i 'am happy !";  //与arg不再统一作用域内,正确
        }
    }
}

只有在相同作用域内重复声明时会出现报错

块级作用域

在块级作用域中对函数声明相当于let语句,在作用域之外不能调用该函数;

对于es6的浏览器,在块级作用域中声明的函数行为相当于var,会提升到全局作用域中
如果需要在块级作用域中定义函数,则应使用函数表达式

// 函数声明语句
{

  function f() {
    let a = 1;
    return a;
  };
}

// 函数表达式
{
  
  let f = function () {
     let a = 2;
    return a;
  };
}

do

块级作用域是一个语句,没有返回值,在块级作用域前加上do将其转换为表达式

{
  let t = f();
  t * t + 1;
//大括号外无法得到t的值
}

let x = do {
  let t = f();
  t * t + 1;
};  //x为大括号内获得的t值

const命令——声明只读变量

{
    const PI = 3.14;
    PI = 3;  //报错
    
    const h;  //报错
}

本质:

const定义的变量不可改动是指变量所指向的地址不可改动;简单类型的数据,值就保存在变量所指向的地址中;复合类型的数据,变量即一个指针,所指向的数据结构是可变化

{
    const a = [];
    a.push('hello world !');  //正确
    
    const foo = {};
    foo.a = 2;
    foo = {"hello world ! "};  //改变了变量foo的指向关系,将会报错
}

可使用Object.freeze方法进行对对象的冻结

{
    const foo = Object.freeze({});
    foo.a = 2;
    foo = {"hello world ! "};  //严格模式下报错
}

声明变量的方法

参考链接:http://es6.ruanyifeng.com/#docs/let

上一篇 下一篇

猜你喜欢

热点阅读