1. 為什么需要塊級作用域
ES6之前只有全域作用域和區域作用域(函式作用域),沒有塊級作用域,會帶來很多不合理的情況,
第一:內層變數可能會覆寫外層變數
// 1.內部變數可能會覆寫外部變數
var num = 100
function fn() {
console.log(num);
if(true){
var num = 200;
}
}
fn() //undefined
這段代碼的原意是: if陳述句外部使用外層的num, if陳述句的內部使用內層的num,但是由于函式fn的定義的num存在變數提升,覆寫了外層的num變數,所以輸出結果為undefined,
第二: 用來計數的回圈變數泄露為全域變數
// 2.用來計數的回圈變數泄露為全域變數
var arr = [1,2,3,4,5];
for(var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
console.log(i); // 5
變數 i 只用來控制回圈,但是回圈結束后,他并沒有消失,泄露成為了全域變數,
2. 什么是塊級作用域?
塊級作用域由{ }包裹,例如if陳述句和for陳述句,通過let宣告變數可以實作塊級作用域,
例1:
function fn() {
let num = 10;
if(true) {
let num = 20;
}
console.log(num);
}
fn() // 10
if 陳述句的外層和內層都宣告了num變數,輸出的結果為10,說明if陳述句的塊級作用域不會影響到外層作用域,如果是都用var宣告則輸出的結果為 20,
例2:
var arr = [1,2,3];
for(let i = 0; i < arr.length; i++) {
arr[i] = function() {
console.log(i);
}
}
arr[0](); //0
arr[1](); //1
arr[2](); //2
let在代碼塊中都有自己的作用域,在for回圈中 i 的每一個值都會單獨存在一個獨立的作用域,arr[i]不會被之前的arr[i]給覆寫掉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/305467.html
標籤:其他
