这里简单的介绍几个es6的语法,都是在vue中需要用到的

let & const

let

es6新增了一个let命令,用来声明变量,这个命令和var差不多,但是略有差别。下面介绍此中差距

let声明的变量是块级作用域

分别执行下面两段代码

// ************* 代码一 *****************
{
    var a = 12;
}
console.log(a);    // 12

// ************* 代码二 *****************
{
    let a = 12;
}
console.log(a);    // a is not define

上面两段代码都是在代码块中定义变量a并赋值,然后在代码块外面调用变量a。唯一不同的就是用来声明变量a的命令不同,那么可想而知,结果自然不同,使用var声明的变量在代码块外仍然有效,所以打印的结果是12。但是使用let声明的变量在代码块外面就访问不到了,所以结果是 a is

let声明的变量不能重复声明

{
	var a = 12;
	var a = 13;
}
console.log(a);   // a = 13

{
	let a = 12;
	let a = 13;
}
console.log(a);    // a has already been declared

由上面的代码可知,var声明的变量可以被覆盖。但是如果使用let声明变量,再次声明就会报错

在for循环中使用let的好处

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6]();

在上面的例子中,由于var声明的是全局变量i,因此在下面执行a[6]()方法时console.log(i)的i指向的仍然是全局的这个i,而此时的i已经在for循环之后变成了10,因此不管在下面执行哪一个方法,a[1]也好,a[2]也好,最终都会打印10,

但是有的时候就希望 i 就是当前的数字怎么办?这时用let就好办了

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6]();

由于前面提到过,let声明的是块级作用域,因此在每一次循环中都有i,对应的就是当前循环的 i 的数字

变量提升的问题

console.log(foo); // 输出undefined,浏览器渲染的时候会先声明var foo; 到后面再赋值
var foo = 2;

在上面的例子中,foo变量的声明在使用的后面,但是这并不会报错,因为浏览器会先帮我们声明foo,因此只会打印undefined

console.log(bar); // 报错ReferenceError
let bar = 2;

但是使用let就不一样了,使用let声明的变量不会允许变量提升,所以在bar变量没有声明前调用会报错

const

const是用来声明常量的,一旦声明不能修改

const PI = 3.1415;

PI = 3;   // TYPEError,报错

模板字符串 & 箭头函数

模板字符串

模板字符串是es6引入的新特性,在以前的时候如果字符串中出现了需要插入对象的情况,就只能使用字符串拼接,那样会显得非常麻烦,那么这个模板字符串就是用于改变这种情况的,它能够极大的简化字符串的拼接

var a = 1;
var b = 2;

// 老式插法
var str = 'a=' + a + 'and b=' + b;

// 模板插入
var str = `a=${a} and b=${b}`;

像上面那样使用${}就可以把变量引入,但是注意,不再使用引号表示字符串了,而是使用反引号

箭头函数

首先看下箭头函数跟普通函数的区别

// 普通函数写法
var f = function(a){
	return a;
}

// 箭头函数
var f = (a) => a;
// or
var f = (a) => {
	return a;
};

// function(){}   等价于   ()=>{}

有上面的代码可知,箭头函数就是把 function(){} 简化成了 ()=>{}

但是使用箭头函数也会有一点问题,下面一一列举

this的指向问题

上面说 function(){}等价于()=>{}其实是不准确的,因为在this的指向上这两者仍旧有一些区别

在执行function定义的函数时,this会指向执行时的对象,而箭头函数会指向定义时的对象

var name = '张三';   
var person = {
       name:'李四',
       age:18,  
       fav:function(){        
           console.log(this)
           console.log(this.name)
       }
}

person.fav();   // this指向执行时的对象,即person



var name = '张三';   
var person = {
       name:'李四',
       age:18,  
       fav: ()=>{        
           console.log(this)
           console.log(this.name)
       }
}

person.fav();   // this指向定义时的对象,即window

arguments不能使用

使用箭头函数还有一个问题,那就是arguments不能再使用了

var func = function(){
	console.log(arguments);
}

func(1, 2, 3);   // 打印1 2 3


var func = () => {
	console.log(arguments);
}

func(1, 2, 3);   // 报错