var:定义的是变量,没有块作用域概念,可以跨块级作用域访问,但是不能跨函数访问,并且可以变量提升
let:定义的是变量,只能再块作用域里访问,不能跨块访问,也不能跨函数访问。
const:定义的是常量,初始化需赋值(一旦赋值不能修改)不然报错
function test() {
console.log(name);
console.log(age);
var name = "test";
let age = 20;
}
test(); //undefined ReferenceError
//先通过 var 关键字声明了 name 变量。这意味着变量被提升了,直到程序运行到定义变量位置之前默认值都是 undefined
//通过let或者const 关键字声明的变量也会提升,但是和var不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的,当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。
/**---块级作用域-----*/
{
var test_1 = 1;
let test_2 = 2;
const test_3 = 3;
console.log(test_1); //1
console.log(test_2); //2
console.log(test_3); //3
}
console.log(test_1); //1
console.log(test_2); //ReferenceError: b is not defined
console.log(test_3); //前面报错了
/**---函数作用域-----*/
(function testB() {
var test_5 = 5;
let test_6 = 6;
const test_7 = 7;
console.log(test_5); //5
console.log(test_6); //6 在同一个{}中,也属于同一个块,可以正常访问到
console.log(test_7); //7 在同一个{}中,也属于同一个块,可以正常访问到
})();
console.log(test_5); //ReferenceError: test_5 is not defined
console.log(test_6); //前面报错了
console.log(test_7); //前面报错了