更新時間:2022-01-18 來源:黑馬程序員 瀏覽量:
如果在for循環(huán)中使用let關鍵詞聲明變量,索引值只會在循環(huán)體內有效,循環(huán)結束后,索引值會被回收;
如果在for循環(huán)中使用var關鍵詞聲明變量,索引值在循環(huán)結束后,索引值仍然可以訪問,所以在for循環(huán)中使用let關鍵字聲明變量時最合適的。
如下面案例:
<script> for (var i = 0; i <= 10; i++) { } console.log(i); // 輸出:11 for(let j = 0; j <= 10; j++){ } console.log(j); // ReferenceError: j is not defined </script>
運行結果
<script> var name = 'zhang'; function name_change() { console.log(name); // undefined if(false){ var name = 'wang'; } } name_change(); // undefined </script>
上面代碼中,使用var關鍵字定義了全局變量name,在name_change()函數中輸出變量name,但是var關鍵字存在變量提升,在if代碼塊內的變量name會提升至函數name_change()函數頂部,導致輸出的name覆蓋了外層的全局變量name,因此輸出“undefined”。
<script> var name = 'zhang'; function name_change() { console.log(name); // zhang if(false){ let name = 'wang'; } } name_change(); // zhang </script>
如果使用let定義if代碼塊兒內的name,那么name變量只在if代碼塊塊內有效,不會影響到全局變量name,所以能夠輸出“zhang”。
立即執(zhí)行函數(Immediately-Invoked Function Expression,簡稱IIFE)的內部是一個獨立的函數級作用域,使用IIFE的目的主要是避免污染當前作用域內的變量,而使用塊級作用域則可以直接避免這個問題。
// IIFE 寫法 (function () { var arg = ...; ... }()); // 塊級作用域寫法 { let arg = ...; ... }
猜你喜歡: