es6学习之let和const命令

42次阅读

共计 1124 个字符,预计需要花费 3 分钟才能阅读完成。

let 和 const 命令
let 命令是在它所在的代码块有效,它属于块级作用域,es6 新增。es5 只有全局作用域和函数作用域。let 命令存在暂时性死区(TDZ),即在申明前使用就会报错, 不存在变量提升
console.log(a); // 报错
let a = 111;
==let 不允许在相同作用域中,重复申明同一变量 ==
块级作用域和函数声明
es6 中明确规定在块级作用域中可以声明函数,在块级作用域中,函数声明语句的行为类似于 let,在块级作用域外不可引用。以下是 es6 中对函数声明做的规定

允许在块级作用域内声明函数。
函数声明类似于 var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。

看下面一段代码
// ES6 环境
function f() { console.log(‘I am outside!’); }
(function () {
if (false) {
function f() { console.log(‘I am inside!’); }
}

f();
}());

// Uncaught TypeError: f is not a function
会报错,应该块级作用域中的函数声明类似于 var,会被提升到块级作用域头部,下面是实际运行代码
//ES6 环境
function f() { console.log(‘I am outside!’); }
(function () {
var f = undefined;
if (false) {
function f() { console.log(‘I am inside!’); }
}

f();
}());
// Uncaught TypeError: f is not a function
所以要避免在块级作用域中声明函数,如果必须的话使用函数表达式
const 命令
const 声明一个只读的常量,声明后不可改变,需要注意的是 const 只是保证声明的变量指向的那块内存空间保存的数据不能改动,对于复合型数据(对象和数组),变量指向的内存地址,保存的是一个指向实际数据的指针,const 只能保证这个指针是固定的,指针指向的数据结构是可以变的,因此对象可以添加属性,数组可以添加数据,但是他们不能赋给另一个变量
const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: “foo” is read-only
es6 中有六中声明变量的方法:var 命令和 function 命令,let 和 const,还有 import 命令和 class 命令
es5 中顶层对象和全局变量是挂钩的,全局声明的变量是顶层对象的属性,es6 中 let,const,class 命令声明的全局变量不在是全局变量的属性

正文完
 0