发表于: 2017-04-10 23:46:18
1 1193
今天完成的事情:
继续看红宝书基础知识
明天计划的事情:
修改组织管理模块bug
遇到的问题:
暂无
收获:整理了下ES6 let和const命令
1.let命令:声明变量,只在let所在的代码块有效。
不存在变量提升:
暂时性死区:块级作用域内存在let命令,他所声明的变量就绑定(bingding)在这个区域,不再受外部影响。
如果区域内存在let和const命令,这个区域对这些命令生命的变量,从一开始就形成了封闭作用域,凡是在声明之前使用这些变量救护报错。
不允许重复声明:let不允许在相同作用域内,重复声明同一变量;
function(){
let a=10;
var a=1;
} //报错
function(){
let a=10;
let b=1;
} //报错
不能在函数内部重新声明参数:
function(arg){
let arg; //报错
}
function(arg){
{
let arg;
}
} //不报错
块级作用域:
为什么需要块级作用域:1、内层变量会覆盖外层变量
2、用来计数的循环变量泄漏为全局变量
ES6块级作用域:let实际上是为JS新增了块级作用域。
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5 注意块级作用域的概念
}
ES6允许块级作用域的任意嵌套。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
块级作用域与函数声明:
do表达式:
本质上块级作用域是个语句,将多个操作封装在一起,没有返回值。
块级作用域可以变为表达式,加上do,变为do表达式。
let x=do{
let t=f();
t*t+1;
}; //变量x会得到整个块级作用域的返回值
const命令:声明一个只读的变量,一旦声明常量的值就不能改变。const一旦声明就必须初始化,不能留到以后赋值。只声明不赋值就会报错,const与let命令相同:只在声明所在的块级作用域内有效。
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
上面代码中,常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。
ES6六种声明变量的方法:
ES5 var 和 function let和const import命令和class命令。
顶层对象的属性:浏览器环境指的是window对象,Node指的是global对象。ES5中顶层对象的属性与全局变量是等价的。
ES5这样带来的问题:1、没法在编译时报出未声明的错误,只有在运行时才知道(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的)
从ES6开始全局变量将逐渐与顶层对象的属性脱钩。
评论