Es6语法学习(一)
Es6语法学习(一)
学习资料主要参考自阮一峰大佬的博客文章。ECMAScript 6 入门
let命令
let声明的变量只在它所在的代码块有效。
1 | { |
变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。
1 | var a = []; |
变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
1 | var a = []; |
另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
1 | for (let i = 0; i < 3; i++) { |
let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
1 | //var |
1 | if (true) { |
let不允许在相同作用域内,重复声明同一个变量。
1 | function func(arg) { |
块级作用域
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
第一种场景,内层变量可能会覆盖外层变量。
1 | var tmp = new Date(); |
第二种场景,用来计数的循环变量泄露为全局变量。
1 | var s = 'hello'; |
const命令
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
1 | const foo = {}; |
ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
1 | var a = 1; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 mopinlan!
评论