1.变量声明let和const
在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如:
function aa() { if(bool) { var test = ‘hello man‘ } else { console.log(test) } }
以上代码实际为:
var bool=true; function aa() { var test // 变量提升 if(bool) { test = ‘hello man‘; console.log(test) } else { //此处访问test 值为undefined console.log(test) } console.log(test)//此处访问test 值为‘hello man } aa();
ES6中:
const:常量;
let:变量;
const PI2= 3.1415926 PI2 = 201452789 //再次赋值此时会报错 //常量则不能更改
const callbacks=[]; for(var i=0;i<=2;i++){ callbacks[i]=function(){ return i*2; } } console.table([ callbacks[0](), callbacks[1](), callbacks[2](), ])
运行结果“
const callbacks2=[]; //只有let这一处不一样!!!! for(let i=0;i<=2;i++){ callbacks2[i]=function(){ return i*2; } } console.table([ callbacks2[0](), callbacks2[1](), callbacks2[2](), ])
代码结果:
因为let和const都是块级作用域。let的作用域是在它所在当前代码块,但不会被提升到当前函数的最顶部。
2.ES5中块作用域:立即执行函数: ( (function(){}) ());
( (function(){ function f2(){ return 1; } console.log(f2()===1); //true }) () ); ( (function(){ function f2(){ return 2; } console.log(f2()===2); //true }) () )
ES6中块作用域:{}
{ function f2(){ return 1; } console.log(f2()===1); //true } { function f2(){ return 2; } console.log(f2()===2); //true }
3.箭头函数
ES5 function a(){}
{ const evens=[1,3,5,7]; const odds=evens.map( function(v){ return v+1; }) console.log(evens,odds); //(4) [1, 3, 5, 7] (4) [2, 4, 6, 8] }
ES6 ()=>{} //只有一个参数时,小括号可以省略;{}中的表达式直接作为返回值时,{}也可以省略
{ const evens=[1,3,5,7]; const odds=evens.map(v=>v+1); console.log(evens,odds); //(4) [1, 3, 5, 7] (4) [2, 4, 6, 8] }
ES6中this没有形成自己的作用域,this指向离它最近的作用域块