es6 语法入门
-
let 和 var
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。(有块级作用域) let不像var那样,会发生“变量提升”现象。只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些命令,就会报错。同一作用域内,重复命名都会引起语法错误SyntaxError。 -
块级作用域
let实际上为JavaScript新增了块级作用域。块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。
另外,ES6也规定,函数本身的作用域,在其所在的块级作用域之内。需要注意的是,如果在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。vs var的优势:
-
作用域更加清晰,不会存在变量作用域自动提升问题
-
作用域更好控制,块级作用域
-
runtime自动检测,重复声明的函数会异常
-
-
const命令
const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。需要注意的是,对常量重新赋值不会报错,只会默默地失败。
const的作用域与let命令相同:只在声明所在的块级作用域内有效。const命令也不存在提升,只能在声明的位置后面使用。const声明的常量,也与let一样不可重复声明。
由于const命令只是指向变量所在的地址,所以将一个对象声明为常量必须非常小心。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。const a = []; a.push("Hello"); // 可执行 a.length = 0; // 可执行 a = ["Dave"]; // 报错 // 如果真的想将对象冻结,应该使用Object.freeze方法。 // 除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。 var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, value) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } }); };
const和let的唯一区别在于,const可以让数值、字符串和布尔变量不可变。
-
全局对象的属性
全局对象是最顶层的对象,在浏览器环境指的是window对象,在Node.js指的是global对象。ES5规定,所有全局变量都是全局对象的属性。
ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。