一、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)较为适合