一、var关键字

1.var声明作用域

在函数内,使用var声明的变量为局部变量,并且只能在函数内调用(变量将在函数退出时被销毁)如下:

function test () {
     var message = 'hello' // 局部变量
 }
 test()
 console.log(message) // 报错

注意:

如果函数内没有使用var声明变量 则该变量变为在全局变量 可以在函数外部调用

*** 不推荐使用全局变量 原因如下:1.全局变量难以维护 2.严格模式下会报错 ***如下:

function test () {
     message = 'hello' // 全局变量
 }
 test()
 console.log(message) // hello

2. var声明提升

举例:

function foo () {
     console.log(age)
     var age = 18
 }
 foo() // undefined
console.log(age)在声明变量之前 调用函数没有报错 返回值为undefined 这种情况就叫变量提升 相当于以下代码:function foo () {
     var age
     console.log(age)
     age = 18
 }
 foo() // undefined


这就是所谓的变量提升。

3.可重复声明一个变量

二、let关键字

1.let声明作用域

let和var的第一个区别是作用域不同 let声明的作用域为块作用域例如:

if (true) {
     var age = 18
     let name = 'cc'
 }
 console.log(age) // 18
 console.log(name) // 报错:name未定义


注意:块作用域是函数作用域的子集。

2.let声明不允许冗余声明例如:

var name 
var name 
let age
let age // 报错
换言之:一个变量名只允许声明一次。

3.全局声明

let在全局作用域下声明的变量不会变成window对象的属性(var会)例如:

var name = 'cc'
 console.log(window.name) // cclet age = 19
 console.log(window.age) // undefined


但是 let声明仍在全局作用域中发生 相应变量会在页面生命周期内存续 所以let不能重复声明变量。

三、const关键字

const 声明变量和let的相同点:1.作用域在块作用域下 2.不允许重复声明变量

1.const声明

1.使用const声明变量时 必须要初始化变量否则会报错例如:

const age  // 报错const age = 26
 2.尝试修改const声明的变量会导致运行时错误const name = 'cc'name = 'gg' // 报错

3.const声明的限制适用于指向的变量的引用

换言之:如果变量引用的是一个对象的话 那么修改对象内部的属性并不违反const的限制。

4.不能用const来声明迭代对象

原因:迭代对象会自增(自减) const不允许被修改

注意:const可以声明不会被修改的for循环变量 每次迭代都是生成一个新的变量 (for-in) (for-of)较为适合