1.变量声明问题
var:var声明变量,允许重复变量声明,会导致数据被覆盖; var声明变量,会导致变量提升,导致数据的访问出错,闭包问题 var声明的变量,会被提升为全局变量,会挂载到全局对象中,影响全局对象的使用(覆盖已有window对象)
if(Math.random() < 0.5){var a = "abc"console.log(a)}else {console.log(a);}console.log(a);
var div = document.getElementById("buts")for (var i = 1; i <= 10; i++) {var btn = document.createElement("button");btn.innerHTML = "按钮" + i;div.append(btn);btn.onclick = function () {console.log(i);// 11}}
var abc = "123"console.log(window.abc); //123
2.let声明变量
let的声明的变量 不会挂载到全局对象中; 不允许当前作用域范围内重复声明; 使用let不会有变量提升,不能在定义let变量之前使用该变量; let在底层实现上也会有变量提升,但是,提升后会将其放入到”暂时性死区”,如果访问的变量位于暂时性死区,则会报错(Cannot access ‘a’ before initialization),当代码运行到该变量的声明语句时,会将其从暂时性死区中移除; 在循环中,用let声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环都是一个全新的循环变量); 在循环中使用let声明的循环变量,在循环结束后会销毁
3.const声明变量
const和let声明的变量特性几乎没有区别,仅在于用const声明的变量,必须在声明时赋值,而且不可以重新赋值(类似于常量) 在开发中,尽量用const来声明变量,以保证变量的值不会被随意更改。 常量不可变,是指声明的常量的内存空间不可变,并不保证内存空间中的地址指向的其他空间不可变。 变量的命名 特殊的常量:一定不可变的常量叫做特殊的常量,命名时需要大写,多个单词之间用下划线分割 普通的常量:使用普通命名即可 在for循环中,循环变量不可以使用常量(for…in…除外)
