变量提升
console.log(number);
---------------
输出:number is not defined
----------------
console.lod(number);
var number = 123;
----------------
输出:undefined
浏览器在执行前会提前对代码进行解析,所以语句var number=123
就相当于是var nember; number = 123;
let & const
-
暂时性死区(TDC)
使用
let
和const
声明的变量,可以避免变量提升造成的混乱,只有定义后才可使用 -
var
、let
、const
的共同点var num1 = 123 function show() { var num2 = 456 }
num2为
show()
私有的变量,函数内也可由通过num1=789
来改变全局的变量num1
-
let
和const
具有块级作用域,const
定义的变量在同一作用域中不可改变,变量内存地址不可改变,因此引用类型变量可以改变其值 -
使用
let
定义的变量不会改变window
全局表变量 -
使用
var
在同一作用域中可对同一个变量进行重复声明,使用let
和 const
不可
VAR变量使用的一些问题
-
全局污染
var num = 456 function func(){ num = 123; } func(); console.log(num);
此是会输出两个
123
,函数体里的num
污染了全局的变量,所以函数体里的
num
要使用var num = 123
来声明,来避免或者 在开头声明使用JS提供的
use strict
严格模式 -
没有块级作用域
var i = 99; for (var i = 0; i<5; i++){ console.log(i); } console.log(i);
输出一次为
0 1 2 3 4 5
,可使用let
来声明for
循环里的变量
变量冻结
Object.freeze()
const ID = {
name: 'zhangsan',
}
Object.freeze(ID);
//此时 ID 对象里的属性值将不可进行修改