在JavaScript中,this代表的是当前对象。
var that=this就是将当前的this对象复制一份到that变量中。这样做有什么意义呢?
//绑定事件
bindEvent:function(){
var that=this;
$("btn_buy").οnclick=function(){
that.buy();
}
$("btn_addcart").οnclick=function(){
that.addShopCart();
}
}
$(‘#conten').click(function(){
//this是被点击的#conten
var that = this;
$(‘.conten').each(function(){
//this是.conten循环中当前的对象
//that仍然是刚才被点击的#conten
});
});
可以看到,this对象在程序中随时会改变,而var that=this之后,that没改变之前仍然是指向当时的this,这样就不会出现找不到原来的对象。
\
es6标准制定之后,我们就可以使用let来声明一个变量,从而让代码变得更加容易控制
接下来我就说一下我对let和var的看法
首先,用var声明的变量会存在变量提升
也许你会问什么是变量提升 如下图
变量未定义直接使用就会报is not defined


但是如果你这样写的话,在控制台看到的就是undefined,而不是未定义


你一定很疑惑,因为我们都经常看到说js代码是从上往下执行的
其实,这是因为js解析的时候会把变量提升到代码的最上方,当然,函数也会被提升(之后有空再说这个)。所以就相当于这样

这就是所谓的变量提升
而let就没有变量提升这个概念,用let之后a变量就变成了未定义

接着我们再来看看let最大的好处 ——多了块级作用域
我们知道 在es6之前js只有全局作用域和函数作用域,并且外部作用域无法访问内部作用域的变量,这样子有时候会让我们无法清晰的理解变量的作用域在哪里,所以es6引入了块级作用域
先来看一段循环代码,注意这里使用的是var 来声明变量,然后在循环外面打印变量
这样可以获取到变量i的值,这是因为es6之前for if这些条件循环语句是没有自己的作用域的,它们的作用域就是它们的外层作用域

但是,如果我们用let来声明,这样就无法打印变量i的值了
这是因为let声明的变量多了块级作用域,可以简单的理解为一对花括号就是一个块级作用域,for里面形成了自己的作用域,不会被外部读取
外部的i无法读取for循环里面的i变量,所以就报错

有了块级作用域之后我们就可以更加容易的掌握变量所在的作用域了