1.变量:var,let,const

var在ECMAScript的全部版本中均可以使用,而const和let只能在ES6及更晚的版本中使用。函数

var,let,const三个关键字的区别spa

var:code

1)声明做用域:在函数内部,使用var定义一个变量(局部变量),在函数被调用完以后,该变量会被当即销毁。在定义变量时若是省略var,就会建立一个全局变量(不建议在局部做用域中定义全局变量,难维护,并且在严格模式下,会致使抛出ReferenceError)。对象

2)声明提高:把全部变量声明都拉到函数做用域的顶部。blog

function foo(){
    console.log(age);
    var age = 18;
}

等价于ip

function foo(){
    var age;
    console.log(age);
    age = 18;
}
foo();//undefined

3)能够反复屡次使用var声明同一个变量作用域

function foo(){
var age = 16;
var age = 1;
var age = 2;
console.log(age);
}
foo();//2

4)全局声明:使用var在全局做用域中声明的变量会成为window对象的属性。io

var age = 18;
console.log(window.age);//18

let:console

1)声明做用域:let声明的是做用域,而var声明的是函数做用域。块做用域是函数做用域的子集,因此var做用域的限制同时也适用于letfor循环

//var
if(true){
    var age = 18;
    console.log(age);//18
}
console.log(age);//18
//let if(true){ let age = 18; console.log(age);//18 } console.log(age);//ReferenceError:age没有定义

2)声明提高:let声明的变量不会在做用域中被提高

3)不能够在一个块中反复屡次使用let声明同一个变量

let age;
let age;//SyntaxError,标识符age已经声明过了

4)全局声明:使用let在全局做用域中声明的变量不会成为window对象的属性,可是var声明的变量会。

let age = 18;
console.log(window.age);//undefined

5)条件声明:在使用var声明变量时,因为声明会被提高,JS会自动将多余的声明在做用域顶部合并为一个声明。而由于let的做用域是块,因此不可能检查前面是否已经使用let声明过同名变量。所以对于let,不能依赖条件声明模式。

6)for循环中的let声明:在用let声明迭代变量时,JS在后台会为每一个迭代变量声明一个新的迭代变量,每一个setTimeout引用的都是不一样的迭代变量。for-in 和for-of都适用。

for(var i=0;1<5;i++){}
console.log(i);  //5

for(let i=0;1<5;i++){}
console.log(i);  //ReferenceError:i没有定义
for(var i=0;1<5;i++){
    setTimeout(()=>console.log(i),0);
}
//会输出5,5,5,5,5

for(let i=0;1<5;i++){
    setTimeout(()=>console.log(i),0);
}
//会输出0,1,2,3,4

const:

1)const的行为和let基本相同,惟一的区别是const它声明变量时必须同时初始化变量,且尝试修改const声明的变量会致使运行时错误(TypeError)。

2)不容许重复声明

3)做用域也是块

4)const声明的限制只适用于它指向的变量的引用。换句话说,若是const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

const person = {};
person.name = "QiuYing";

5)不能用const声明迭代变量,由于迭代变量会自增。可是能够声明一个不会被修改的for循环变量。这对for-in 和for-of循环特别有意义。

 

 声明风格及最佳实践:先使用const,let次之,不使用var

相关文章
相关标签/搜索