JS 常量 和 变量 详解
1、常量和变量的标识符
标识符 必须是 字母 、 下划线 、 美元符号 $ 和 数字 ,但必须是 字母 、 下划线 、 美元符号 $ 开头,依然是不能以 数字 开头。
标识符 区分大小写。
2、变量声明
- var 声明一个变量
- let 声明一个块作用域中的局部变量
- const 声明一个常量
- 变量声明和初始化是可以分开的
- 常量必须在声明时赋值,之后不能修改
- var 会把变量提升到当前全局或函数作用域
- 变量和常量的选择:如果明确知道一个标识符定义后不再修改,应该尽量声明成 const 常量,减少被修改的风险,减少BUG
3、例子
3.1 简单声明
var a
let b
console.log("1:", a, b)
a = 1
b = 'This-is-a-string!'
console.log("2:", a, b)
// const c -- Missing initializer in const declaration.
const c = 100 // 常量必须在声明时赋值,之后不能修改
console.log("3:", c)
// c = 200 -- Assignment to constant variable.
Info: Start process (下午4:10:34)
1: undefined undefined
2: 1 This-is-a-string!
3: 100
Info: End process (下午4:10:34)
3.2 声明变量说明
// 只是声明,y值为 undefined
var y
// 规范的声明并初始化,声明全局或局部变量
var x = 5
// 不规范的初始化,不推荐。 在严格模式下会产生异常。
// 在赋值之前不能引用,因为它没有声明。一旦这样赋值就是全局作用域
z = 6
3.3 变量的作用域
- function 是函数的定义,是一个独立的作用域,其中定义的变量在函数外不可见
- var a = 100 可以提升声明,也可以突破非函数的块作用域(但是无法突破函数)
- a = 100 隐士声明不能提升声明,在“严格模式”下会出错,但是可以把变量隐式声明为全局变量。(建议少用)
- let a = 100 不能提升声明,而且不能突破任何的块作用域。(推荐使用)
- 严格模式:使用 “use strict” ,这条语句放到函数的首行,或者 JS 脚本首行
3.3.1 函数作用域中的变量
function test() {
a = 100
var b = 200
let c = 300
}
test()
console.log(a)
// console.log(b) -- b is not defined
// console.log(c) -- c is not defined
Info: Start process (下午4:21:58)
100
Info: End process (下午4:21:59)
3.3.2 函数中变量的作用域
if (true) {
a = 100
var b = 200
let c = 300
}
console.log(a)
console.log(b)
// console.log(c) -- c is not defined
Info: Start process (下午4:32:03)
100
200
Info: End process (下午4:32:04)