一,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