ES6学习之路01——let和const

2018-03-02  本文已影响0人  现在就是李白

1. let

ES6明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用这些变量,就会报错.
暂时性死区也意味着typeof不再是一个百分之百安全的操作

/** 隐蔽的死区 */
function bar(x = y, y = 2) {
    return [x, y];
}

console.log(bar());
// ReferenceError: y is not defined
// 原因是参数x的默认值是y,而此时y还没有声明,属于死区

/** 修改之后 */
function bar(x = 2, y = x) {
    return [x, y];
}

console.log(bar());
// [ 2, 2 ]

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量.

2. 块级作用域

// IIFE 写法
(function(){
    console.log('IIFE Function');
})();

3. const命令

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动.对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量.但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了.因此,将一个对象声明为常量必须非常小心.

const foo = Object.freeze({name: 'Make', age: 18});

//常规模式下,下边一行不起作用;
//严格模式下,下边一行会报错;
foo.color = 'red';
/** 下面是一个将对象彻底冻结的函数 */
let constantize = (obj) => {
    Object.freeze(obj);
    Object.keys(obj).forEach((key, value) => {
        if (typeof obj[key] === 'object') {
            constantize(obj[key]);
        }
    })
};

const user = {
    name: 'Mark',
    age: 18,
    color: 'red'
};
console.log(user);
// { name: 'Mark', age: 18, color: 'red' }
constantize(user);
user.type = 'object';
console.log(user);
// { name: 'Mark', age: 18, color: 'red' }

4. 顶层对象的属性

ES6为了改变顶层对象的属性与全局变量挂钩这个问题.一方面规定.为了保持兼容性.var命令和function命令声明的全局变量.依旧是顶层对象的属性;另一方面规定.let命令、const命令、class命令声明的全局变量.不属于顶层对象的属性.也就是说.从ES6开始.全局变量将逐步与顶层对象的属性脱钩.

上一篇下一篇

猜你喜欢

热点阅读