var、let和const

声明提前:
JS程序在正式运行前,会将所有的var声明的变量和function声明的函数,预读到所在作用域的顶部,但是对变量的赋值还留在原来的位置。
var和let区别
var用于声明变量,存在"变量提升现象",即变量可以在声明之前使用,值为undefined。
let也是用于声明变量,其用法类似于var,但是所声明的变量只在let命令所在代码块中有效。let不存在变量提升,未声明的变量不能赋值,否则会报错

//var
console.log(a);//undefined
var a=10;
//let
console.log(b);//Uncaught ReferenceError: b is not defined
let b=20;

let存在暂时性死区,暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明的哪一行代码出现,才可以获取该变量。

var num=1;
if(true){
	num=2;//Uncaught ReferenceError: num is not defined
	let num;
	console.log(num);//undefined
	num=3;
	console.log(num);//3
}
var x=x;//不会报错
let x=x;//报错

let不允许在相同作用域内声明同一变量。

//Uncaught SyntaxError: Identifier 'a' has already been declared
(function(){
	let a=1;
	var a=2;
	console.log(a);
})()
//Uncaught SyntaxError: Identifier 'a' has already been declared
(function(){
	let a=1;
	let a=2;
	console.log(a);
}())
//Uncaught ReferenceError: arg is not defined
function(){
	let arg;
	consoel.log(arg);
}(arg))

let可以为JavaScript实现块级作用域

function f1(){
	let n=5;
	if(true){
		let n=10;
	}
	console.log(n);//5
}

const用来声明一个常量。一旦声明,常量的值就不能改变。而且const一旦声明常量,就必须立即初始化,不能留到以后赋值。

const PI=3.14;
PI=3;//Uncaught TypeError: Assignment to constant variable.
const foo;//Uncaught SyntaxError: Missing initializer in const declaration

const的作用域与let相同:只在声明所在的块级作用域内有效。
const命令声明的常量也不会提升,同样存在暂时性死区,只能在声明后使用。同样也不能重复声明。

猜你喜欢

转载自blog.csdn.net/qq_41805715/article/details/84644821