ES6变量声明
ES6中新增了let与const来定义变量:
var
:ES6和ES5中,定义全局变量(varible的缩写)let
:定义局部变量,替代varconst
:定义常量(定义后不可修改)
var:全局变量
{
var a = 1;
}
console.log(a); //这里的a指的是代码块里的a
上方代码可以输出结果为1,因为var是全局声明的,所以,即使是在区块里声明,但仍在全局起作用
再来看看下面这段代码:
var a = 1;
{
var a = 2;
}
console.log(a);
输出为2,因为var是全局声明的
总结:用var定义的全部变量,有时候会污染整个js的作用域
let:定义局部变量
var a = 1;
{
let a = 2;
}
console.log(a);
输出为1,用let声明的变量,只在局部(块级作用域)起作用
let是防止数据污染,我们来看一个经典的for循环的例子
①:用var声明变量
for(var i = 0; i < 10; i++) {
console.log(i); //每循环一次,就会在{}所在的块级作用域中,重新定义一个新的i
}
console.log(i);
上方代码可以正常打印结果,且最后一行结果是10,说明定义的变量i是在全局起作用的
①:用let声明变量
for(let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i);
上面的最后一行无法打印结果,因为let定义的变量有块级作用域
**总结:**我们要习惯用let声明,减少var声明带来的污染全局空间
const:定义常量
在程序开发中,有些变量是希望声明后,在业务层就不再发生变化,因此可以用const来定义
好处:const定义的常量不会被修改
注意:用const声明的变量,只在局部(块级作用域)起作用
let和const的作用
- 禁止重复声明
- 支持块级作用域
- 控制修改
相反,用var声明的变量,可以重复声明,没有块级作用域,不能限制
ES6箭头函数
定义和调用函数:(传统写法)
function fn1 (a,b) {
return a + b;
}
console.log(fn1(1,2));
定义和调用函数:(ES6)
var fn2 = (a,b) => a + b;
console.log(fn2(1,2));
二者的效果是一样的
在箭头函数中,如果方法体内不止一句话,那就需要在方法体外边加上括号{} 例如:
var fn2 = (a,b) => {
console.log('haha');
return a + b;
}
console.log(fn2(1,2));
从上面的箭头函数中,我们可以很清晰的找到方法名,参数名,方法体
上方代码中:
- 如果只有一个参数,则()可以省略
- 如果方法内只有一句话,则{} 可以省略,但前提是这条语句必须是return
this指向
箭头函数只是为了写起来更酷吗?当然不是,它含有很大一个作用就是与this的指向有关
ES5中,this指向的是函数被调用的对象,而ES6的箭头函数中,this指向的是函数被定义时
简单来说,箭头函数的this,是不会变的,是永远绑定在当前的环境下