es6 初級之let

1.在es6 中,定義變量使用 let.html

1.1 var定義變量:es6

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <script>
 8         var j = 39;
 9         var j = "aaa";
10         console.log(j);
11     </script>
12 </head>
13 <body>
14 </body>
15 </html>

運行結果:閉包

1.2  let定義變量:換成使用ES6 的 let 相同格式定義變量:異步

1         let j = 39;
2         let j = "aaa";
3         console.log(j);

輸出:輸出報錯函數

緣由:let 是塊級做用域,不能夠重複定義ui

 

1.3 所謂塊級做用域,能夠理解爲{}括起來的範圍,或者函數體內部的範圍,例如:this

1         let a = 10;
2         if (a) {
3             let a = 100;
4             console.log(a);        //100
5         }
6         console.log(a);            //10

1.4  var 和let的區別:spa

1.4.1 輸出var 循環後的i 值code

1         for (var i = 1; i <= 10; i++) {
2 
3         }
4         console.log(i);                               //11

結果:循環後,輸出結果爲11htm

1.4.2 輸出 let 循環後的 i 值

1    for (let i = 1; i <= 10; i++) {
2 
3         }
4    console.log(i); //外面訪問不到

結果:輸出後,結果報錯,顯示沒有定義。

1.4.3 在for循環內,i 值能夠輸出

1         for (let i = 1; i <= 10; i++) {
2             //能夠訪問的到
3             console.log(i);
4         }
5         console.log(i); //外面訪問不到

運行結果:

 

1.5  var 和 let 在函數中的差別

1.5.1 var 

 1  function show(flag) {
 2             console.log(a);             //undefined
 3             if (flag) {
 4                 var a = 'aluoha';
 5                 return a;
 6             } else {
 7                 console.log(a);         //undefined
 8                 return null;
 9             }
10    }
11    show(false);
12    show(true);

運行結果:

1.5.2 let

 1  function show(flag) {
 2             console.log(a); //報錯了
 3             if (flag) {
 4                 let a = 'ghostwu'; //let定義的變量不會提高
 5                 return a;
 6             } else {
 7                 console.log(a);
 8                 return null;
 9             }
10         }
11  show(false);
12  show(true);

運行結果:在第11行直接報錯了,由於在第2行的console.log(a)中,a 沒有定義

報錯緣由:i 用let 進行定義,let是塊及做用與,只是在{}內起做用,{}外就不起做用了;可是,若是使用var 定義i,var 是全局做用域,會進行變量提高,將var a 提到console.log(a)以前,因此就不會報錯

 

2.  let 應用:

獲取點擊框的索引:

下面這種方式沒法獲取:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <script>
 8         window.onload = function() {
 9             var aBtn = document.querySelectorAll("input");
10             for (var i = 0; i < aBtn.length; i++) {
11                 aBtn[i].onclick = function() {
12                     console.log(i);
13                 }
14             }
15         }
16     </script>
17 </head>
18 <body>
19     <input type="button" value="按鈕1">
20     <input type="button" value="按鈕2">
21     <input type="button" value="按鈕3">
22     <input type="button" value="按鈕4">
23 </body>
24 </html>

結果:不管點擊那個按鈕,獲得的結果都是4

緣由:i 循環後,結果是4;而點擊事件是一個異步事件,異步事件的執行老是在同步事件的執行以後,執行完循環,纔會去執行點擊事件

2.1 一般的作法,在input 元素上加上一個自定義的索引 index ,點擊的時候,獲取index 的值,而不是獲取 i 的值,這樣就能夠達到獲取索引的目的了

js代碼修正:

 1 <script>
 2         window.onload = function() {
 3             var aBtn = document.querySelectorAll("input");
 4             for (var i = 0; i < aBtn.length; i++) {
 5                 aBtn[i].index = i;
 6                 aBtn[i].onclick = function() {
 7                     console.log(this.index);
 8                 }
 9             }
10         }
11  </script>

結果:

2.2  採用閉包的方式獲取索引:

 1 window.onload = function() {
 2             var aBtn = document.querySelectorAll("input");
 3             for (var i = 0; i < aBtn.length; i++) {
 4                 aBtn[i].onclick = (function(j) {
 5                     return function() {
 6                             console.log(j);
 7                         }
 8                 }(i));
 9             }
10 }

結果:

2.3 採用es6  let 方式定義:

 1  window.onload = function() {
 2             var aBtn = document.querySelectorAll("input");
 3             /*
 4                 第一次 i = 0, i++以後 ---> 釋放
 5                 第一次 i = 1, i++以後 ---> 釋放
 6             */
 7             for (let i = 0; i < aBtn.length; i++) {
 8                 aBtn[i].onclick = function() {
 9                     console.log(i);
10                 }
11             }
12   }

運行結果:

相關文章
相關標籤/搜索