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]);
}
});
}
完!!!
网友评论