1.常规var

var是一开始最常用的,具有变量提升,没有块作用域概念的特性等,比较的过于自由

但是需要注意一个问题就是,var在全局声明的变量,会添加到windows属性上,而let和const不会

涉及闭包,this指向,和var和let的区别的一道题目

演示:
var str = '这是外面的'
var obj = {
	str:'这是里面的',
    getData(){
    	retrun function(){
        	console.log(this.str)
        }
    }
}

obj.getData()()	//输出:这是外面的,因为此时返回的函数,this指向是windows,而var全局声明的会挂载到windows上


反例:
let str = '这是外面的'
let obj = {
	str:'这是里面的',
    getData(){
    	retrun function(){
        	console.log(this.str)
        }
    }
}


obj.getData()()	//输出:undefined

2.ES6新特性,let,const

一.let

特性: 1.具有块作用域概念 2.不会变量提升 3.不能重复声明

=========================================================================== 对比 var 的实例:

先定义三个div,类名是box,使得他们点击变成粉红色

var item = document.getElementsByClassName("box")

for(var i = 0 ; i < 2 ; i++ ){
    item[i].onclick = function(){
        item[i].style.backgroundColor = 'pink';
    }  
}

在这里,我们试图通过for循环的var i 来对我们的item元素的样式进行更改,但是这样会报错

原因:因为onclick是属于异步函数,并非同步,所以在触发onclick点击函数之前,for循环已经创建了三个区域
{
    var i = 0 ;
}
{
    var i = 1 ;
}
{
    var i = 2 ;
}

此时随着最后一次的i++落定,最终i的数值是为3
因为var的特性,导致三个块作用域里的i受到最终i的影响,皆为3,所以就导致了等onclick触发的时候
item[i]的数值,始终为item[3],从而找不到导致报错
此时在onclick的函数中只能用this来替代item[i]

此时用let 来代替 var
for(let i = 0 ; i < 2 ; i++ )
此时的let哪怕最后i++了等于了3,但是因为let的特性,具有块作用域的概念,互不影响,所以可以让每一块的item[i]都保持独立

二.const

特性: 1.用于常量,不可被二次更改 2.但是当用于定义数组,对象的时候,可以被增删内容 3.一定要赋初始值