一、var 的缺陷:var 只有全局作用域和函数作用域,没有块级作用域,除了在函数内部的变量默认都属于window
var foo='hello'; fn=function(){ var foo='world' } fn(); console.log(foo);//hello if(true){ var foo='bar' } console.log(foo);//bar
二、let 定义变量:ES6新增可以定义块级作用域,但是没有变量提升,必须先声明再使用,不能重复声明,主要是解决了var没有块级作用域的缺陷
let foo='hello'; if(true){ let foo='bar'; if(true){ let foo='vue'; if(true){ // 也有块级作用域链 console.log(foo);//vue } console.log(foo);//vue } console.log(foo);//bar } console.log(foo);//hello
三、const 定义常量:也是ES6新增的可以定义块级作用域,用于定义常量,常量不允许修改,并且声明的同时必须赋值,也没有变量提升,不允许重复声明,并且const比let的效率高
const foo='hello'; if(true){ const foo='bar'; if(true){ const foo='vue'; if(true){ // 也有块级作用域链 console.log(foo);//vue } console.log(foo);//vue } console.log(foo);//bar } console.log(foo);//hello
四、使用建议:不要使用var,使用let和const,如果你使用的这个成员,一次都没有变过,则使用const定义,如果至少变了一次,则使用let定义。
更多详细知识点,请参考ECMAScript 6 入门。