(声明, 本文的所有代码均在node的最新稳定版本v4.4.3中执行的, 如果在浏览器中执行请把JS的运行环境提升为ES6)
以前一直用var定义变量, 现在有了两种新的定义变量的方式, 1: let, 2: const;本文大概概括下使用let和const定义变量有哪些好处;
1:声明提前
使用var声明变量,存在声明提前的问题, 输出的tmp为"undefined":
{ var tmp = new Date(); let f = function (){ console.log(tmp); //undefined if (false){ //使用var声明变量的声明提前; var tmp = "hello world"; } } f(); }
如果我们把定义tmp的方式改为let呢? 那么tmp输出的结果为当前的日期。
{ var tmp = new Date(); let f = () => { console.log(tmp); //输出的结果为当前的日期 if (false){ //使用let的方式声明, tmp的作用域只有在离他最近的一个{}括号中; let tmp = "hello world"; } } f(); }
2:块状作用域
let和const不但拥有块状作用域, 还也不存在声明提前这个玩意儿, 以下代码会报ReferenceError错
{ let tmp = 123; { tmp = 234; let tmp = 456; } }
使用let声明的元素作用域更加明确, 不会出现作用域混乱的情况, 可以减少bug的产生;
{ let foo = 0; { let foo = 1; foo = 2; } console.log(foo); }
以上这段代码相当于是IIFE(立即执行函数表达式), 效果和以下的相同;
{ var foo = 0; (function(){ var foo = 1; foo = 2; }()); console.log(foo); }
再来猜猜这个的结果是什么,( var 形式声明的变量会提升到{}外面去哦 , {}形式的块状作用域相当于是if(true){//code}的写法):
{ var foo = 0; { var foo = 1; foo = 2; } console.log(foo); }