let和const
- a = 1会声明一个全局变量是错的,只有在没有a这个变量的时候,a = 1才会声明一个全局变量。所以a = 1含义不明,所以尽量不要使用a= 1
// 1.情况
a = 1 //声明一个全局变量
console.log(window.a)
//2.情况
var a
function fn(){a = 1 //a不一定是全局变量,外面有var a,所以此时只是给a赋值,也是全局变量
}
//3.情况
var a
function fn(){
var a
function fn2(){
a = 1 //局部变量
}
}
- var a不管写在哪里,都会有一个声明提升。
function fn(){
if(true){
console.log(a) //代码不会报错
}else{
var a //a还是被声明了
//此时这个地方的代码不会执行
console.log(2)
}
}
- var a = 1会不小心暴露全局变量window.a
//以下代码还是会暴露两个全局变量a,frank解决办法,用一个带有函数名的函数把所有的代码包裹起来。
//此时,a才是局部变量,frank是全局变量,但此时函数也是全局便变量。
{
var a
window. frank = function(){
console.log(a)
}
}
以上代码的解决方案是:用一个立即执行的匿名函数包裹所有的代码,就可以避免a的提升。
!function(){
var a = 1
window.frank = function(){
console.log(a)
}
}()
- let 不暴露全局变量,let就是写在哪,位置就在哪,不会有变量的提升。
- let 的作用域遇到{ }就停止。
{
let a = 1
window.frank = function(){
console.log(a)
}
}
console.log(a) //a is not defined
- let也是可以嵌套的。要先声明在使用。(存在Temp Dead Zone)
{
let a = 1
console.log(a) // 1
{
console.log(a) // 报错(Temp Dead Zone)这是临时死区
let a = 2
console.log(a) //2
{
let a = 3
cosole.log(a) //3
}
}
}
- const和let差不多,但是const只有一次赋值机会,后面在赋值,就会报错。const主要应用在常量上,例如PI
{
let a = 1
let a = 2 //报错(不可以重复声明)
//------------------
let a = 1
a = 2 //允许,不会报错(允许重复赋值)
//---------------------
const a = 1
a = 2//报错(只有一次声明及赋值)
//------
const a //报错(一定要在声明的时候赋值)
}
总结:
- let的总结
- let 的作用域在最近的{}之间;
- 如果你在let a之前使用a,那么报错(一定要先声明,在使用);
- 如果重复let a那么,报错;
- let的作用:为了方便的使用局部变量,而不需要引入立即执行函数
- cnst的总结
- 1,2,3同上。
- 只有一次赋值机会,而且在声明的时候立马赋值。
- 一般常量赋值使用const,比如PI。
网友评论