var的设计是Javascript语言上的缺陷,但修复后以前的问题会使得以前的代码存在兼容性问题。
Brendan Eich十年前修复这个问题,于是添加了一个新的关键词:let,可以将let看成更完美的var
块级作用域
变量作用域:在什么范围内可以使用变量
1)var存在的问题
JS使用var声明一个变量的时候,变量的作用域主要和函数的定义有关,针对其他块定义来说是没有作用域的,这在产品的开发过程中往往会存在一些问题。
例:五个按钮,每按一次打印出第几个按钮被点击
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>es6语法</title>
</head>
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<script src="../js/vue.js"></script>
<script>
buttons = document.getElementsByTagName('button')
for(var i=0; i<buttons.length; i++)
{
buttons[i].addEventListener('click', function(){
console.log('第' + i + '个按扭被点击')
})
}
</script>
</body>
</html>
运行结果只能显示“第5个按钮被点击”,这是因为var没有快级作用域,在调用function时候,for循环已经将i变为5,导致问题复杂。
2)利用let有效解决问题
通过let引入if或者for作用域,有效解决问题。
原理,通过let引入块级作用域,每个块级都有各自对因的i,当然,function()是有块级作用域的,因此也可以利用闭包解决问题。