01- let 变量 与 const 常量

2018-08-21  本文已影响13人  夏海峰

1、let 变量

let 声明的变量只在它所在的代码块内有效。ES5 只有两种声明变量的方法:var 命令和 function 命令。ES6 除了添加 let 和 const 命令,另外两种声明变量的方法:import 命令和 class 命令。所以,ES6 一共有 6 种声明变量的方法

{
    var a = 10;
    let b = 20;
    const c = 30;
}
console.log(a);  // 10

console.log(b);  // b is undefined

console.log(c);  // c is undefined

for(let i =0; i<10; i++) {
    //
}
console.log(i);   // i is undefined


var a = [];
for(var i = 0; i<10; i++) {
    a[i] = function() {
        console.log(i);
    }
}
a[6]();   // 10

2、var 变量与变量提升

使用 var 声明的变量,存在变量提升。

var tmp = new Date();

function f() {
    console.log(tmp);
    if (false) {
        // var tmp 变量提升
        var tmp = 'hello world';
    }
}

// 上面 f 函数等价于 f1函数
function f1() {
    var tmp;
    console.log(tmp);
    if(false) {
        tmp = 'hello world';
    }
}

f();   // undefined
f1();  // undefined


for(var i=0; i<10; i++) {
    // ....
}
console.log(i);  // i 是一个全局变量,即 var 变量提升

3、const 常量

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

const PI = 3.14;
// PI = 4;   报错

const OBJ = {};
OBJ.name = 'geek';   // 不报错
console.log(OBJ);

// 冻结对象
const foo = Object.freeze({});  // foo被冻结,将无法再被改变
foo.name = 'geek';  // 该行代码不起作用、或者会报错
console.log(foo);

功能封装:冻结一个对象及其所有后代中的对象属性。

var constantize = (obj) => {
    Object.freeze(obj);
    Object.keys(obj).forEach((key,i)=>{
        if (typeof obj[key] === 'object') {
            // 递归 冻结
            constantize(obj[key]);
        }
    });
}

完!!!
上一篇 下一篇

猜你喜欢

热点阅读