174   JS

一,var:

ES6 之前,只有 var 来定义变量,在函数域里生效,如果变量没有 var ,就默认全局变量;
var 定义的变量存在变量提升的现象,即可以先使用变量,变量定义可以放到最后,程序执行时,变量定义会提升到最顶部;
var 变量还会覆盖本域里的相同变量名,而且不会报错,非常容易出现变量污染

 

二,let

ES6 引入两个种变量定义:块区域变量 let,常量 const

let 只在块区域有效,块区域一般指大括号内部
let 不存在变量提升,必须先定义才能使用,否则会报错
let 在本区域内不能重复定义,否则也会报错
通过代码实例来理解下 var 和 let 生效区域的区别

for(var i=0;i<3;i++){
	console.log(i)
}
// var i 在这里还生效
console.log(i)

// let 只在for循环生效
for(let l=0;l<3;l++){
	console.log(l)
}
// 会报错,没有定义
console.log(l)




for(var i=0;i<3;i++){
	// 输出 i 会一直等于 3,因为执行console.log输出时,for 循环已经执行完毕,i 取最后的值
	setTimeout(function(){
		console.log(i)
	},1);
}

for(let l=0;l<3;l++){
	// 输出 l 会是 0 1 2,因为 let 变量只在该区域有效,不受外界影响
	setTimeout(function(){
		console.log(l)
	},1);
}
          

 

三,const

const 也属于块区域变量,也不能重复定义
但它主要特点是定义为常量,在定义时必须初始化,它的情况分为两种
1,基本数据类型,比如 Number、String 、Boolean、Null和Undefined,在定义和初始化后,是不能改变的,因为这些类型的数据是以原始值直接保存到内存中
2,引用数据类型,比如 Object,Array,是以引用指针方式保存到内存,可以在 const 定义后,改变属性,但不能改变数据类型

// 会报错,只定义没有初始化
cons t;
// 正常
const a = 1;
// 会报错,基本数据类型不能在初始化后更改
a = 2; 


const b = {};
// 正常,因为引用类型的指针没有发生变化
b.one = 1;
// 会报错
b = []



Leave a Reply

Your email address will not be published. Required fields are marked *