JavaScript高级程序设计研读之声明变量的三种方式
预先需要掌握的知识点:
一、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和var的第二个区别就是 let不会进行变量提升 而var会进行变量提升
// name 会被提升
console.log(name) // undefined
var name = 'cc'
// age不会被提升
console.log(age) // 报错
let age = 18
在let声明之前的执行瞬间被称为
暂时性死区
4.全局声明
let在全局作用域下声明的变量不会变成window对象的属性(var会)
举个🌰:
var name = 'cc'
console.log(window.name) // cc
let age = 19
console.log(window.age) // undefined
但是 let声明仍在全局作用域中发生 相应变量会在页面生命周期内存续 所以let不能重复声明变量
5.for循环中的let声明
let声明和for循环配一脸 可以解决我们之前迭代的变量的奇特声明和修改
举个🌰:
for (var i=0, i<5,i++){ console.log(i)}// 5 5 5 5 5
之所以会这样是因为在退出循环时 迭代变量保存的是导致退出循环的值:5
但是 使用let声明迭代变量时 每次都会生成一个新的迭代变量 所以打印出来的迭代变量的值也跟之前有所区别
for (let i=0,i<5,i++) { console.log(i)}// 0,1,2,3,4
三、const关键字
const 声明变量和let的相同点:1.作用域在块作用域下 2.不允许重复声明变量
1.const声明
1.使用const声明变量时 必须要初始化变量否则会报错
const age // 报错const age = 26
2.尝试修改const声明的变量会导致运行时错误
const name = 'cc'name = 'gg' // 报错
3.const声明的限制适用于指向的变量的引用
换言之:如果变量引用的是一个对象的话 那么修改对象内部的属性并不违反const的限制
举个🌰:
const obj = { name: 'cc', age: 18}obj.age =19 // 不会报错
4.不能用const来声明迭代对象
原因:迭代对象会自增(自减) const不允许被修改
注意:const可以声明不会被修改的for循环变量 每次迭代都是生成一个新的变量 (for-in) (for-of)较为适合
新手上路 如有不对 请各位大佬多多指正