JS 中变量名全名规则
JS 中变量名中可以使用$,_,数字以及大小写字母,但是数字不能作为开头,大小写敏感
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var a var b1 var c$ var $ var _ var $_a var $123 var a = 123
console.log(A)
var 1
var break var new var a+b
var private
|
什么是变量提升
- JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
三种变量声明方式
var
存在变量提升(在声明前使用其值为 undefined)
1 2 3 4 5
| console.log(foo) var foo = 123 var bar = {}
window.bar === bar
|
const
必须先声明时定义值 定义后值不可变(类似 C 语言指令,指针的指向不可以变,但指向地址的内容可以变)
1 2 3
| const foo = {}
foo.a = '123'
|
let
可以先声明后定义,声明后值可变 可以多次改变值
1 2 3 4
| let bar bar = 123 bar = '123' bar = {}
|
let/const
都存在块级作用域,不可多次声明,不存在变量提升,在声明前使用会报 ReferenceError(暂时性死区),不会出现隐式全局变量.
1 2 3 4
| console.log(bar) console.log(foo) let bar = 123 const foo = {}
|
1 2 3 4 5 6
| { let foo = {} const bar = 123 } console.log(foo) console.log(bar)
|
1 2 3 4 5
| const bar = 789 var bar = 456 var foo = {} let foo = 123
|
1 2 3 4 5 6
| { let bar = 123 var foo = {} } window.foo window.bar
|
动态变量类型
1 2 3 4 5
| var a a = "123" typeof a a = 123 typeof a
|
不声明直接使用
1 2 3 4 5 6 7 8
| a = 123 window.a === a
(function(){ "use strict" bar = 3 })()
|