es5中var定義的變量只有全局作用域和函數作用域,沒有塊級作用域的概念。es6中let有塊級作用域,相當於是var的進一步完善。
下面以按鈕點擊爲例,一共5個按鈕,綁定點擊事件,點到第幾個按鈕,提示第幾個按鈕被點擊。
var
<body>
<div id="app">
<button>button1</button>
<button>button2</button>
<button>button3</button>
<button>button4</button>
<button>button5</button>
</div>
<script>
var btns = document.getElementsByTagName("button");
for (var i = 0; i < btns.length;i++)
{
btns[i].addEventListener('click', function ()
{
console.log("第"+i+"個按鈕被點擊!")
});
}
</script>
</body>
運行結果如下圖:
無論點擊哪個按鈕都提示第5個按鈕被點擊,因爲 i 沒有塊級作用域,點擊事件在執行的時候 i 已經變成5了。
let
如果將var改成let,如下所示
<body>
<div id="app">
<button>button1</button>
<button>button2</button>
<button>button3</button>
<button>button4</button>
<button>button5</button>
</div>
<script>
var btns = document.getElementsByTagName("button");
for (let i = 0; i < btns.length;i++)
{
btns[i].addEventListener('click', function ()
{
console.log("第"+i+"個按鈕被點擊!")
});
}
</script>
</body>
效果如下所示
相當於每個按鈕的點擊事件都有一個自己的 i 變量,都是一個塊級作用域。