var
var 是es6之前 js用来声明变量的方法,其特性是:
只有两个作用域,全局作用域和局部作用域,(var在函数内部定义,就是局部变量)。
// 点击对应li时,在控制台输出对应的索引值
var lis = document.getElementsByTagName("li");
for (var n = 0; n < lis.length; n++) { //var定义的 n 全局变量
lis[n].onclick = function () {
console.log(n); //4 4 4 4 触发函数fn后拿到的是全局变量n ,全局变量循环结束时n=4
}
}
let
let 是es6新增的声明变量的方式 ,其特点是:
1.作用域是块级作用域
2.不能挂载到window对象上
3.不存在声明提前
4.不能重复定义
5.存在暂时性死区
// 点击对应li时,在控制台输出对应的索引值
var lis = document.getElementsByTagName("li");
for (let n = 0; n < lis.length; n++) { //let定义的 n 块级作用域
lis[n].onclick = function () {
console.log(n); //0 1 2 3 触发函数fn后拿到的是块级作用域n,第一次循环n=0
}
}
var 和 let 区别:
1.var 声明的变量可以是全局作用域和局部作用域,而let声明的作用域是块级作用域。(在ES6之前,js只存在函数作用域以及全局作用域)
if (true) {
var x = 20; //全局变量 x
}
console.log(x); //20
if (true) {
let x = 20; //let定义的x只在块级作用域中生效
}
console.log(x); //x is not defined 外面输出拿不到块级作用域中的x
2.var 声明的变量会被挂载到 window 对象上,let 则不会。
var a = 20;
let b = 30;
console.log(window.a); //20
console.log(window.b); //undefined
- var声明的变量有声明提前功能,let则没有
console.log(a);
console.log(b);
var a = 100; //undefined var a 声明提前 100赋值留在本地
let b = 200; //报错
4.var声明变量可以重复定义,let则不行
var a = 1;
console.log(a); //1
var a = 2;
console.log(a); //2 后定义的覆盖之前的
let a = 1;
console.log(a); //报错 'a' has already been declared
let a = 2;
console.log(a); //报错 'a' has already been declared
5.暂存死区:块级作用域中,通过let声明的情况,变量只能在let赋值后使用。
var a = 1; //全局变量a
if (1) {
console.log(a);
let a = 2; //块级作用域a
}
const
const一般用来声明常量,且声明的常量是不允许改变的,只读属性,因此就要在声明的同时赋值。const与let一样,都是块级作用域,存在暂时性死区,不存在变量声明提前,不允许重复定义。
const requestUrl = "http://102.123.123/";
requestUrl = 123;
console.log(requestUrl); //报错 Assignment to constant variable. 不能改变常量变量的赋值